【Excel VBA】「マクロ無効化」を回避!初期画面の自動切り替えと画像自動削除の完全実装ガイド
Excelツールを他のユーザーに配布した際、「マクロを有効化してもらえず動かない」「意図しない画像が残ってファイルが重くなる」といった悩みを抱えたことはありませんか?
今回は、実務で使える 「マクロ有効化を促す初期画面コントロール」 と 「不要画像の全自動クリーンアップ」 を組み合わせた、非常に堅牢なVBAイベントプロシージャのコードを徹底解説します!
💡 このコードで実現できること
- 「マクロ無効化」対策(セキュリティ制御)
- マクロが無効のまま開かれた場合は「案内画面(開始画面)」しか見せない構造にします。
- マクロが有効化されて初めて、本編のシートが自動で一括表示されます。
- 手動での「シート再表示」を完全ガード
- Excelの通常非表示ではなく
xlSheetVeryHiddenを使用し、右クリックの「再表示」から隠しシートを見られないようにします。
- Excelの通常非表示ではなく
- ブックを開いた瞬間に不要画像を自動クリーンアップ
- 指定した大切な画像(例:
Picture 1,Picture 2)だけを残し、追加された不要な図形・画像を自動削除してファイルを軽快に保ちます。
- 指定した大切な画像(例:
💻 実装コード(ThisWorkbook モジュールに記述)
以下のコードを、VBAエディタ(VBE)の ThisWorkbook モジュールに貼り付けて使用します。
VBA
Option Explicit
'==================================================
' ブックを開いたとき
'==================================================
Private Sub Workbook_Open()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
On Error GoTo ExitProc
' 描画とイベントの停止(画面チラつき防止&無限ループ防止)
Application.ScreenUpdating = False
Application.EnableEvents = False
'--------------------------------------
' 1. 開始画面以外の全シートを表示
'--------------------------------------
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> Sheet22.CodeName Then
ws.Visible = xlSheetVisible
End If
Next ws
'--------------------------------------
' 2. 開始画面を非常に強い非表示にする
'--------------------------------------
Sheet22.Visible = xlSheetVeryHidden
'--------------------------------------
' 3. 最初の表示シートをアクティブ化
'--------------------------------------
For Each ws In ThisWorkbook.Worksheets
If ws.CodeName <> Sheet22.CodeName Then
ws.Activate
Exit For
End If
Next ws
'--------------------------------------
' 4. Picture1、Picture2 以外の画像を自動削除
'--------------------------------------
For Each ws In ThisWorkbook.Worksheets
' 図形削除は必ず末尾からの逆順ループ(Step -1)で行う
For i = ws.Shapes.Count To 1 Step -1
Set shp = ws.Shapes(i)
If shp.Type = msoPicture Or shp.Type = msoLinkedPicture Then
Select Case UCase(shp.Name)
Case "PICTURE 1", "PICTURE 2"
' 指定画像は残す
Case Else
shp.Delete
End Select
End If
Next i
Next ws
ExitProc:
' 設定を必ず元に戻す(エラー時も確実に通過)
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
'==================================================
' ブックを閉じるとき
'==================================================
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Dim ws As Worksheet
On Error GoTo ExitProc
Application.ScreenUpdating = False
Application.EnableEvents = False
'--------------------------------------
' 1. 開始画面を表示
'--------------------------------------
Sheet22.Visible = xlSheetVisible
'--------------------------------------
' 2. 本編シートをすべて非表示化(再表示不可)
'--------------------------------------
For Each ws In ThisWorkbook.Worksheets
If ws.CodeName <> Sheet22.CodeName Then
ws.Visible = xlSheetVeryHidden
End If
Next ws
'--------------------------------------
' 3. 開始画面アクティブ状態で上書き保存
'--------------------------------------
Sheet22.Activate
ThisWorkbook.Save
ExitProc:
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub
🔍 コードの深掘り解説!知っておくべきVBAテクニック
① xlSheetVeryHidden(非常に非表示)の活用
通常、Excelでシートを非表示(xlSheetHidden)にしても、シートタブの右クリックメニューから誰でも「再表示」できてしまいます。 しかし、xlSheetVeryHidden を設定すると、VBAコードからしか再表示できなくなります。ブックを閉じるときに本編シートをこれにしておくことで、マクロを無効化して開いたユーザーには「マクロを有効にしてください」という案内画面しか見せなくすることができます。
② シート名変更に強い CodeName(コード名)参照
コード内で ws.Name ではなく ws.CodeName(VBE上で確認できるオブジェクト名)を利用しています。これにより、運用中にユーザーがExcel上でシート名を自由に変更(例:「シート1」→「売上データ」)しても、VBAエラーを起こさずに動き続けます。
③ シェイプ(図形・画像)削除は「逆順ループ(Step -1)」が絶対条件!
図形やセル行などを削除する際、通常の 1 To Count(正順)でループを回すと、削除した瞬間に番号がズレて「削除漏れ」や「範囲外エラー」が発生します。 削除処理を行う際は、今回のように For i = ws.Shapes.Count To 1 Step -1 と末尾から逆順でループさせるのがVBAの鉄則です。
📌 まとめ
今回のプロシージャを導入するだけで、Excelツールの安全性・信頼性・メンテナンス性が一気に向上します。業務効率化ツールを作成・配布する際は、ぜひ参考にしてみてください!


-300x200.png)