【Excel VBA】「マクロ無効化」を回避!初期画面の自動切り替えと画像自動削除の完全実装ガイド

Excelツールを他のユーザーに配布した際、「マクロを有効化してもらえず動かない」「意図しない画像が残ってファイルが重くなる」といった悩みを抱えたことはありませんか?

今回は、実務で使える 「マクロ有効化を促す初期画面コントロール」「不要画像の全自動クリーンアップ」 を組み合わせた、非常に堅牢なVBAイベントプロシージャのコードを徹底解説します!

💡 このコードで実現できること

  1. 「マクロ無効化」対策(セキュリティ制御)
    • マクロが無効のまま開かれた場合は「案内画面(開始画面)」しか見せない構造にします。
    • マクロが有効化されて初めて、本編のシートが自動で一括表示されます。
  2. 手動での「シート再表示」を完全ガード
    • Excelの通常非表示ではなく xlSheetVeryHidden を使用し、右クリックの「再表示」から隠しシートを見られないようにします。
  3. ブックを開いた瞬間に不要画像を自動クリーンアップ
    • 指定した大切な画像(例: 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ツールの安全性・信頼性・メンテナンス性が一気に向上します。業務効率化ツールを作成・配布する際は、ぜひ参考にしてみてください!

\ 最新情報をチェック /