【Excel VBA】ブックを開いたときに不要な画像・図形を自動削除するマクロ
概要
Excelファイルを配布する際や、テンプレートとして利用する際に、利用者が貼り付けた画像や不要な図形が残ってしまうことがあります。
今回紹介するVBAは、
- ブックを開いた瞬間に実行
- 指定した画像だけ残す
- それ以外の画像・図形を自動削除
という処理を行います。
これにより、毎回手作業で画像を削除する必要がなくなり、常に決まった状態でExcelを利用できます。
そのまま使えるサンプルコード
こちらは残したい画像名を配列で管理できるため、あとから追加・変更しやすい構成になっています。
Option Explicit
'====================================================
' ブックを開いたときに不要な図形を自動削除する
'
' ■概要
' ・Workbookを開くと自動実行
' ・指定した名前の図形だけ残す
' ・それ以外の図形を削除
'
' ■用途
' ・テンプレート初期化
' ・不要画像の削除
' ・印刷用レイアウトの維持
' ・利用者が貼り付けた画像のリセット
'
'====================================================
Private Sub Workbook_Open()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
'==========================
'残す図形名を設定
'==========================
Dim KeepList As Variant
KeepList = Array( _
"Picture 1", _
"Picture 2" _
)
'==========================
'全シートを処理
'==========================
For Each ws In ThisWorkbook.Worksheets
'削除しながらループするため後ろから処理
For i = ws.Shapes.Count To 1 Step -1
Set shp = ws.Shapes(i)
If Not IsKeepShape(shp.Name, KeepList) Then
shp.Delete
End If
Next i
Next ws
End Sub
'====================================================
' 指定した図形名かどうか判定する関数
'
' 引数
' ShapeName :図形名
' KeepList :残す図形一覧
'
' 戻り値
' True =残す
' False=削除対象
'====================================================
Private Function IsKeepShape( _
ByVal ShapeName As String, _
ByVal KeepList As Variant) As Boolean
Dim v
For Each v In KeepList
If StrComp(ShapeName, CStr(v), vbTextCompare) = 0 Then
IsKeepShape = True
Exit Function
End If
Next
End Functionこのコードのポイント
① 残す画像を簡単に追加できる
例えば
KeepList = Array( _
"Picture 1", _
"Picture 2", _
"Logo", _
"会社印"
)
これだけで残す画像を増やせます。
コード本体を修正する必要がありません。
② 大文字・小文字を区別しない
Picture 1
picture 1
PICTURE 1
どれでも同じ画像として判定します。
③ 後ろから削除する理由
For i = ws.Shapes.Count To 1 Step -1
図形を削除すると番号が詰められるため、
前から削除すると
1
2
3
↓
1削除
2が1になる
となり、一部の図形を飛ばしてしまう可能性があります。
後ろから削除することで安全に処理できます。
④ シートが何枚あっても対応
For Each ws In ThisWorkbook.Worksheets
ブック内の全シートを対象にするため、
- シート追加
- シート削除
があってもコード変更は不要です。
このコードを作成した理由
Excelを複数人で利用する業務では、
- 写真を貼り付ける
- 商品画像を貼る
- スキャン画像を貼る
- 印鑑画像を貼る
といった運用が多くあります。
しかし、
- 古い画像が残る
- 印刷時に不要な画像が表示される
- ファイル容量が増える
- レイアウトが崩れる
といった問題が発生します。
そのため、ブックを開いたタイミングで不要な画像を自動削除し、常に初期状態へ戻せるようにしました。
導入効果
導入後には次のような効果が期待できます。
| 改善項目 | 効果 |
|---|---|
| 作業時間 | 画像削除の手作業が不要 |
| ヒューマンエラー | 削除忘れを防止 |
| ファイル容量 | 不要画像を削除し軽量化 |
| 印刷品質 | 不要画像の印刷を防止 |
| テンプレート管理 | 常に同じ状態で利用可能 |
| 保守性 | 残す画像を一覧で管理できる |
活用例
このマクロは次のような業務で活用できます。
- 見積書
- 請求書
- 日報
- 工事写真管理
- 点検報告書
- 検査記録表
- 製造管理表
- 顧客管理システム
- 出荷管理システム
- 品質管理帳票
さらに汎用化する方法
より実務向けにするなら、以下のような機能を追加できます。
- 「画像だけ」を削除し、ボタンやチェックボックスなどの図形は残す。
- 削除対象を「Picture」で始まる名前だけに限定する。
- 「設定」シートで残す図形名を管理し、VBAを修正せずに運用できるようにする。
- 削除前後の図形数をログとして記録する。
- 非表示シートも含めて一括処理する。
- エラー処理や画面更新停止を追加し、処理速度と安定性を向上させる。
まとめ
このVBAは、Excelブックを開いた際に不要な画像や図形を自動的に削除し、テンプレートを常に一定の状態に保つための便利な仕組みです。配列と判定関数を採用することで保守性と拡張性が向上し、画像の追加・削除にも柔軟に対応できます。業務効率化、ヒューマンエラー防止、ファイル容量の削減など、多くのメリットがあり、帳票管理や社内システムなど幅広い業務で活用できる実践的なVBAテクニックです。


