VBA100本ノック 80本目を動画で解説しています。Excelの神髄さんの模範解答はコチラ
問題
#VBA100本ノック80本目
このブックは変更してほしくないので、以下の動作にしたい。
・開かれたら読み取り専用に設定
・上書き保存や名前を付けて保存をしようとしたら、保存せずに強制的にブックを閉じる
・閉じる時の保存確認メッセージも出さない
※VBA作成中は気を付けて!
※少し追加訂正※
読み取り専用による、以下のメッセージが出てしまうのは構いません。

解答
Option Explicit
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
Cancel = True
ThisWorkbook.Close False
End Sub
Private Sub Workbook_Open()
ThisWorkbook.ChangeFileAccess xlReadOnly
End Sub
Sub 保存用()
Application.EnableEvents = False '新たにイベントが発生しないように
ThisWorkbook.ChangeFileAccess xlReadWrite '読み取り専用を解除
ThisWorkbook.Save
End Sub
■考え方・流れ
0:00 冒頭・問題確認
1:50 ブックを読み取り専用に変更する
4:19 ブックの保存ができないようにする前に…
5:48 ブックの保存をできなくする

保存できなくさせることも
できるんですね!

SUM関数ぐらい
常識だぞ?

絶対違う…
ブックを読み取り専用に変更する
さて!じゃあまずは…
「ブックを開いたら!」て文言があるよね!そこから!!
Workbook_Openイベントを設定すれば良かったよね!!

ブックモジュールにコードを書いていこう!

読み取り専用にするにはどうすればいいか…?
え?方法がわからない?
ならググればいいんだよ!!!

超簡単!

一旦保存して、開いてみると…

ブックの保存ができないようにする前に…
さて!じゃあお次は…
ブックの保尊ができなくなるコードをぎゃんぎゃんに書いていこう!!!
と言いたいところなんだけど…
注意点が!!!
保存できなくなるコードを書いてしまうと、保存できないコードが保存できなくなって困っちゃうんだ!!(言ってること分かるかしら…)
それを回避する方法をお伝えしておくよ!

これは別のプロシージャを作って、
こんな感じで書けばOK!!
ポイントは、イベントがおきなくなるようにする
Application.EnableEvents = False
これだけ抑えてればOK!

先に言っとくと…
保存できなくするためには、Workbook_BeforeSaveというものを使えばいいんだけど…
このイベントを起こさないようにしてから、保存しないといけないってことだ!!

ブックの保存をできなくする
じゃ最後に…実際にブックの保存を不可にして終了だ!!
“できなくする”って日本語、ちょっとどうなん?って思うが…
日本語弱いのですまんw

方法はすごく簡単!!
引数のCancelをTrueに変更すればOK!

とりま、保存を不可とするだけならこれでOK!

あとは、Withの中でわからないものをググって、修正していけばOK!

そして最後!!!
「ブックを強制終了」の部分を追加したら終了!!!

終わりです!!ちょっと簡単だったかな?

お疲れさぁ~!
頑張ったね!

お疲れさまでした!
あとがたり
おはこんばんちは。uぷ主です。
80本目、ブックを編集や保存できないようにするイベントの作成の問題でした…
いや~やられました…
まんまと引っ掛かって…、書いたコードを全消してしまった…
保存用のコードを作ったとは言え…それを実行するのを忘れるんですよね…(馬鹿)
皆さんは気を付けてくださいね!!
あ!あと!
このコードは悪用厳禁ですからね!!
コメント