80本目 ブックを編集や保存できないようにするイベントの作成

VBA100本ノック

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本目、ブックを編集や保存できないようにするイベントの作成の問題でした…

いや~やられました…
まんまと引っ掛かって…、書いたコードを全消してしまった…

保存用のコードを作ったとは言え…それを実行するのを忘れるんですよね…(馬鹿)

皆さんは気を付けてくださいね!!
あ!あと!
このコードは悪用厳禁ですからね!!

コメント

タイトルとURLをコピーしました