VBA 強制的にマクロを有効にする方法(セキュリティ警告非表示) - Excel
VBAで強制的にマクロを有効にする方法(セキュリティ警告非表示)です。
マクロが記録されたブック、または VBA コードが記述されたブックを開くと「セキュリティ警告」画面が表示されます。
これはマクロの設定によるものです。
ここでは セキュリティ警告非表示にしてVBAで強制的にマクロを有効にする方法 を紹介します。
マクロの設定
マクロの設定は以下のようなものがあります。Excel 2010 の場合「ファイル」-「オプション」-「セキュリティセンター」から「セキュリティ センターの設定」ボタンを押下すると以下のような設定画面が表示されます。
Excel 2010での「マクロの設定」画面です。
デフォルトは、「警告を表示してすべてのマクロを無効にする」にチェックが入っています。この場合、マクロが記録されたブックを開くと、以下のような画面が表示され、有効化するまでマクロが起動しません。
また、マクロの設定を「警告を表示せずにすべてのマクロを無効にする」が設定されていた場合、マクロが有効になったかどうか利用者には判断できません。マクロが無効の状態でブックを編集されると、せっかく作ったマクロが機能せず、予定外のブックの編集が可能になったりします。管理者としてはコレは避けたいですよね。
デジタル署名を追加する
マクロが無効の状態でブックが編集されるのを防ぐためには、デジタル署名をおこなうことをおすすめします。そうすれば常にマクロを有効にできます。
・http://office.microsoft.com/ja-jp/excel-help/HA001231781.aspx
VBAで強制的にマクロを有効にさせる
もし、デジタル署名が手間であるようであれば、以下のような方法を試してください。
- ダミーシートを用意する。
- ダミーシートにシートの保護をかける。
- 編集用シートを用意し、シートを非表示をする。
- マクロが起動したら、ダミーシートを非表示にし、編集用シートを表示する。
- ブックを閉じるとき、ダミーシートを表示し、編集用シートを非表示にする。
これを実現できればマクロを実行しなければ編集用シートが表示されないので、強制的に有効にしているのと同じことになります。
サンプルソース
このソースは、ThisWorkbook に記述してください。
Option Explicit
'**
' ワークブックオープン
'**
Private Sub Workbook_Open()
ThisWorkbook.Unprotect Password:="password"
On Error Resume Next
If ThisWorkbook.Sheets("編集用").Visible <> True Then ThisWorkbook.Sheets("編集用").Visible = True
If ThisWorkbook.Sheets("ダミー").Visible <> False Then ThisWorkbook.Sheets("ダミー").Visible = False
ThisWorkbook.Protect Password:="password"
'ThisWorkbook.RunAutoMacros Which:=xlAutoOpen
On Error GoTo 0
Exit Sub
End Sub
'**
' ワークブックを閉じる前
'**
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim Answer As Long
' 保存されているかチェック
If ThisWorkbook.Saved = False Then
Answer = MsgBox("Do you want to save the changes to the '" & ThisWorkbook.Name & "' ?", vbExclamation + vbOKCancel, "Microsoft Excel")
Select Case Answer
Case vbCancel
Cancel = True
Exit Sub
End Select
End If
ThisWorkbook.Unprotect Password:="password"
On Error Resume Next
If ThisWorkbook.Sheets("ダミー").Visible <> True Then ThisWorkbook.Sheets("ダミー").Visible = True
If ThisWorkbook.Sheets("編集用").Visible <> False Then ThisWorkbook.Sheets("編集用").Visible = False
ThisWorkbook.Protect Password:="password"
ThisWorkbook.Save
End Sub
まず、ブックの保護をおこなうためのパスワードを設定します。
ここでは password としています。
マクロが起動されたらブックの保護を解除します。
ThisWorkbook.Unprotect Password:="password"
そして、編集用シートを表示し、ダミーシートを非表示にします。
If ThisWorkbook.Sheets("編集用").Visible <> True Then ThisWorkbook.Sheets("編集用").Visible = True
If ThisWorkbook.Sheets("ダミー").Visible <> False Then ThisWorkbook.Sheets("ダミー").Visible = False
そして、ブックを保護します。
ThisWorkbook.Unprotect Password:="password"
ThisWorkbook内に、Workbook_Open()
を記述すると、標準モジュールで記述された Auto_Open()
が起動しません。もし、標準モジュール内に Auto_Open()
があるようであれば、以下のコメントを解除してください。
'ThisWorkbook.RunAutoMacros Which:=xlAutoOpen
そしてブックを閉じる前に、再びダミーシートを表示し、編集用シートを非表示にします。これにより、次回開くときに、ダミーシートが表示されて、マクロが有効になるまで編集用シートの変更ができなくなります。
If ThisWorkbook.Sheets("ダミー").Visible <> True Then ThisWorkbook.Sheets("ダミー").Visible = True
If ThisWorkbook.Sheets("編集用").Visible <> False Then ThisWorkbook.Sheets("編集用").Visible = False
保存されているかチェックしているのは、例えば編集用シートに何か変更をおこない、上書き保存したのに、閉じる前に再び保存を促すメッセージが表示されるのを防ぐためと、保存しないと再度ブックを開いたときにダミーシートが表示されないことを防ぐためです。
マクロ内でシートを表示したり、非表示にしたりすると変更したとみなされます。
テスト
早速実行してみましょう。マクロが無効な状態ではダミーシートだけが表示されます。
マクロを有効にすると編集用シートが表示されます。
ブックを保護しているのでシートの再表示はできません。
これで利用者がマクロが動作しているかどうかわからなくなることはありませんね。
おつかれさまでした。