【VBA】散らばった丸や直線などの図形を一括削除するマクロの作り方

エクセルのシートに〇や直線などの図形を手作業で追加・削除していませんか?
「有・無」の項目に〇を付けたり、不要な文言に取り消し線を引いたりする書類を毎回手作業で編集していると、処理件数が増えるにつれて作業時間はどんどん膨らんでいきます。
VBAを使えば、シート上に散らばった大量の図形をボタン1クリックで一括削除・リセットすることが可能。
私はこれまでに年間50件以上のマクロ開発を手がけてきましたが、「図形の編集に時間がかかりすぎる」という悩みを持つ方は非常に多いです。
この記事では、図形をまとめて削除するVBAの基本から、種類別・シート指定での削除、そして実務でよく使う「図形のリセット処理」まで、実際のVBAコードを交えて紹介します。
手作業で図形を編集し続けることで起きる3つの問題
エクセルで書類を管理していると、〇(丸)や直線といった図形を使うシーンは意外と多くあります。
「有・無」の表記に〇を付ける、不要な文言に取り消し線(直線)を引く、チェック完了の印として〇を重ねて置く、などが代表的な例です。
こういった作業を毎回手作業でこなしていると、次の3つの問題が起きてしまいます。
問題①:処理件数が増えると作業時間が跳ね上がる
書類が1枚だけなら手作業でも大した手間ではありません。
しかし1日に10枚、20枚と増えていけば、図形を配置して削除するだけで30分以上かかることも珍しくありません。
私が以前受けた開発依頼のお客様は、毎日の書類作成で「図形の〇を正しい位置に付けて、前回の〇を消して」という繰り返しに1日1時間近く費やしていました。
問題②:図形の配置ミスが気づかないまま積み重なる
手作業で図形を動かしていると、少しずつズレが生じます。
「なんかこの〇、微妙に位置がずれているけどまあいいか」という感覚で進めていくと、印刷したときに見た目が崩れたり、意図しない位置に図形が残ってしまう。
ミスに気づかないまま書類を提出してしまうリスクも、手作業ならではの問題です。
問題③:「図形を全部削除してリセット」が意外と手間がかかる
シートを使い回す際、前回入力した〇や直線を全部消してから新しく入力し直す、という作業が発生します。
図形を1つずつクリックして選択して削除して、という繰り返しは非常に地味で時間がかかります。
VBAを使えば、これらの問題をすべてボタン1クリックで解決することができます。
VBAで図形を削除する基本|まずはシート全体の図形を一括削除する方法から理解する
図形を操作するVBAでは、ShapesコレクションとShapeオブジェクトを使います。
ShapesコレクションはシートにあるすべてのShapeオブジェクト(図形)を管理しているコレクションです。
まずは最もシンプルな「アクティブシートにあるすべての図形を削除する」VBAから見ていきましょう。
全図形を一括削除するVBA
Sub 全図形を一括削除()
Dim shp As Shape
Dim ws As Worksheet
Set ws = ActiveSheet
'逆順ループで図形を削除(削除中のインデックスずれを防ぐため)
Dim i As Long
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
MsgBox "すべての図形を削除しました。", vbInformation
End Sub
コードの流れを解説します。
Set ws = ActiveSheet で、現在アクティブになっているシートを処理対象に指定しています。
ws.Shapes.Count To 1 Step -1 という逆順のFor文を使っているのがポイントです。
図形を前から順番に削除していくと、削除のたびにインデックス番号がずれてしまい、一部の図形が削除されずに残ってしまうことがあります。
逆順(後ろから前)に削除することで、このインデックスずれの問題を防ぐことが可能。
このコードを実行するだけで、シート上にあるすべての図形(〇・直線・四角・テキストボックスなど)がまとめて削除されます。
図形の種類を絞って削除するVBA|〇だけ・直線だけを選んで削除する方法
すべての図形を削除するのではなく、「〇だけ削除したい」「直線だけ消したい」という場面も実務では多くありますよね。
エクセルの図形にはそれぞれ「タイプ(種類)」が設定されており、VBAではそのタイプを判別して処理を分岐させることが可能。
図形の種類を絞って削除することで、残したい図形はそのまま保持しながら、不要な図形だけをピンポイントで削除できます。
〇(楕円・オーバル)だけを削除するVBA
Sub 楕円だけ削除()
Dim ws As Worksheet
Dim i As Long
Set ws = ActiveSheet
For i = ws.Shapes.Count To 1 Step -1
'図形タイプが楕円(msoShapeOval)の場合だけ削除
If ws.Shapes(i).AutoShapeType = msoShapeOval Then
ws.Shapes(i).Delete
End If
Next i
MsgBox "楕円(〇)の図形を削除しました。", vbInformation
End Sub
コードの流れを解説します。
ws.Shapes(i).AutoShapeType で図形の種類を取得しています。
msoShapeOval は楕円(〇)を表す定数です。
If ~ Then 条件分岐を使って、楕円タイプの図形だけを削除の対象にしています。
楕円以外の図形(直線や四角など)は処理されずにそのまま残ります。
直線だけを削除するVBA
Sub 直線だけ削除()
Dim ws As Worksheet
Dim i As Long
Set ws = ActiveSheet
For i = ws.Shapes.Count To 1 Step -1
'図形タイプが直線(msoLine)の場合だけ削除
If ws.Shapes(i).Type = msoLine Then
ws.Shapes(i).Delete
End If
Next i
MsgBox "直線の図形を削除しました。", vbInformation
End Sub
コードの流れは楕円の場合とほぼ同じです。
直線(Line)の場合は、AutoShapeType ではなく Type プロパティで判定します。
直線はエクセルの図形分類でいうと msoLine というタイプになります。
ws.Shapes(i).Type = msoLine という条件で直線のみに絞り込み、それ以外の図形はそのまま保持します。
「〇と直線の両方を削除したい」という場合は、条件を Or でつなぐと対応できます。
If ws.Shapes(i).AutoShapeType = msoShapeOval Or ws.Shapes(i).Type = msoLine Then
ws.Shapes(i).Delete
End If
複数シートの図形をまとめて削除するVBA|全シート一括処理で作業時間を短縮する
シートが1枚だけのエクセルならまだよいですが、実務では複数のシートを使い回すケースがほとんどです。
「シート1からシート10まで、すべての〇を一括で削除したい」という場合、シートを1枚ずつ開いて操作していたら時間がいくらあっても足りません。
このパターンを一発で処理するVBAがこちらです。
全シートの図形を一括削除するVBA
Sub 全シートの図形を一括削除()
Dim ws As Worksheet
Dim i As Long
'全シートをループ処理
For Each ws In ThisWorkbook.Worksheets
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
Next ws
MsgBox "すべてのシートの図形を削除しました。", vbInformation
End Sub
コードの流れを解説します。
For Each ws In ThisWorkbook.Worksheets で、ブック内にあるすべてのシートを順番に処理対象にしています。
外側のFor Eachループでシートを切り替えながら、内側のFor Nextループで各シートの図形を逆順に削除していきます。
この処理があれば、シートが何枚あっても1回の実行で全シートの図形をまとめて削除することができます。
特定のシートだけを対象にするVBA
Sub 特定シートの図形を削除()
Dim ws As Worksheet
Dim i As Long
Dim 対象シート As Variant
'処理したいシート名を配列で指定
対象シート = Array("Sheet1", "Sheet3", "集計")
Dim シート名 As Variant
For Each シート名 In 対象シート
Set ws = ThisWorkbook.Worksheets(シート名)
For i = ws.Shapes.Count To 1 Step -1
ws.Shapes(i).Delete
Next i
Next シート名
MsgBox "指定シートの図形を削除しました。", vbInformation
End Sub
コードの流れを解説します。
全シートではなく「Sheet1」と「Sheet3」だけを処理したいという場合は、シート名で処理を分岐させます。
Array(“Sheet1", “Sheet3", “集計") の部分に、処理対象にしたいシート名をカンマ区切りで入力するだけです。
シートを追加したり削除したりしたときは、この配列の中身を変更するだけで対応できます。
図形を削除するだけじゃない!実務で使える「図形リセット処理」VBA
実務で特に役立つのが、図形を削除するだけで終わらせるのではなく「初期状態に戻す(リセットする)」処理です。
「様式にある〇を全部消して、また新しく入力できる状態にしたい」「前回のチェック内容をリセットして同じ書類を使い回したい」という要望は、開発依頼でも非常に多く受けてきました。
実際に私が受けた依頼では、様式に「有・無」という表記が並んでいて、該当する方に〇を付けるという内容がかなり多い。
書類を翌日以降も使い回せるようにするために、「〇を全部消してリセットするボタン」をVBAで作ってほしいという内容でした。
図形をすべて削除してリセットするVBA(名前で管理するパターン)
Sub 図形リセット()
Dim ws As Worksheet
Dim shp As Shape
Dim i As Long
Set ws = ThisWorkbook.Worksheets("様式")
'名前に「チェック」が含まれる図形だけを削除
For i = ws.Shapes.Count To 1 Step -1
If InStr(ws.Shapes(i).Name, "チェック") > 0 Then
ws.Shapes(i).Delete
End If
Next i
MsgBox "チェック図形をリセットしました。", vbInformation
End Sub
コードの流れを解説します。
ws.Shapes(i).Name で図形の名前を取得しています。
InStr(ws.Shapes(i).Name, “チェック") > 0 という条件は、「図形の名前に"チェック"という文字が含まれているか?」を調べる処理です。
InStr関数は文字列の中に指定した文字が含まれているかを確認する関数で、含まれている場合は0より大きい値を返します。
「チェック」という名前が付いた図形だけを削除対象にすることで、シート上に残しておきたい図形(枠線や飾りなど)を誤って消してしまうリスクを防げます。
図形に名前を付けるには、図形を選択した状態でエクセル左上の「名前ボックス」に任意の名前を入力するだけ。
図形に名前を付けて管理することで、削除・再配置の処理が格段にやりやすくなります。
〇を削除した後に別の図形を再配置するVBA(削除→再配置の自動化)
Sub 図形リセット後再配置()
Dim ws As Worksheet
Dim i As Long
Dim newShp As Shape
Set ws = ThisWorkbook.Worksheets("様式")
'ステップ1:既存のチェック図形を全削除
For i = ws.Shapes.Count To 1 Step -1
If InStr(ws.Shapes(i).Name, "チェック") > 0 Then
ws.Shapes(i).Delete
End If
Next i
'ステップ2:初期位置に〇を再配置(例:セルB3の位置に配置)
Dim targetCell As Range
Set targetCell = ws.Range("B3")
Set newShp = ws.Shapes.AddShape( _
msoShapeOval, _
targetCell.Left, _
targetCell.Top, _
targetCell.Width, _
targetCell.Height)
'図形のスタイルを設定(塗りつぶしなし・枠線は赤)
With newShp
.Name = "チェック_B3"
.Fill.Visible = msoFalse
.Line.ForeColor.RGB = RGB(255, 0, 0)
.Line.Weight = 2
End With
MsgBox "図形をリセットして初期配置しました。", vbInformation
End Sub
コードの流れを解説します。
ステップ1で「チェック」という名前が付いた既存の図形をすべて削除します。
ステップ2では ws.Shapes.AddShape を使って新しい〇(楕円)を追加しています。
targetCell.Left、targetCell.Top でセルの座標を取得して、そのセルにぴったり合わせた位置に〇を配置。
.Fill.Visible = msoFalse で塗りつぶしをなし、.Line.ForeColor.RGB = RGB(255, 0, 0) で枠線を赤色に設定。
RGB(255, 0, 0) の数値を変えることで、色を自由に変更することができます。
「リセット後に初期の〇を決まった位置に自動で配置し直したい」という業務にピッタリのマクロです。
関連記事「文字に〇を付けるVBA」では、テキストの長さに合わせた〇を表示させるマクロをダウンロードすることができます。
実際にマクロを動かして便利さを体感してみてください。
図形削除VBAを使う際の注意点
図形削除VBAを実装する際は、いくつかの注意点を押さえておく必要があります。
これから紹介する注意点を知らずに実装すると、「VBAを実行したら残してほしい図形まで消えてしまった」「エラーが出てVBAが途中で止まる」という問題が起きることがあるので注意してください。
注意点①:図形に名前を付けて管理することが重要
VBAで特定の図形だけを削除したい場合、図形に名前を付けて管理するのが鉄則です。
名前なしで「全図形削除」を実行してしまうと、シートのレイアウトを作っている枠線や飾りの図形まで消えてしまいます。
削除・編集したい図形には「チェック_〇〇」「丸印_△△」のように、識別できる名前を付ける習慣をつけておきましょう。
注意点②:逆順ループ(Step -1)を必ず使う
図形をループで削除するときは、必ず逆順(Step -1)でループさせます。
前から順番に削除すると、削除のたびにShapesコレクションのインデックスが変わってしまい、一部の図形がスキップされて削除されないというバグが発生します。
For i = ws.Shapes.Count To 1 Step -1 という書き方を習慣にしておくと安心です。
注意点③:削除前に確認メッセージを入れる
図形の削除は元に戻せない操作です(VBAで実行した操作はCtrl+Zで戻せない場合があります)。
本番運用するVBAには、削除前に確認メッセージを入れる実装にすることで、誤操作によるミスを防ぐことができます。
Dim 確認 As Integer
確認 = MsgBox("図形をすべて削除します。よろしいですか?", vbYesNo + vbQuestion, "確認")
If 確認 = vbNo Then
MsgBox "処理をキャンセルしました。"
Exit Sub
End If
vbYesNo オプションで「はい」「いいえ」の2択ボタンを表示し、「いいえ」が選ばれた場合は Exit Sub でVBAを終了させます。
たった数行のコードですが、誤操作のリスクを大幅に下げられる重要な実装です。
まとめ ~ 図形の削除・リセット作業にはVBAを使った自動化が必須 ~
エクセルの図形を毎回手作業で削除・編集していては、処理件数が増えるにつれて時間と労力が膨らんでいきます。
VBAを使えば、シート全体の図形を一括削除するのはもちろん、〇だけ・直線だけを種類で絞って削除したり、複数シートを一発でまとめて処理したりすることが可能です。
さらに「削除→再配置」の処理を組み合わせれば、書類のリセット作業まで完全に自動化できます。
作業時間の短縮、配置ミスの防止、書類の使い回しを効率化できる、 などメリットしかありません。
今回紹介したコードをベースに、自分の業務に合わせてカスタマイズしてみてください。
図形の削除だけでなく、〇を付ける・直線を引くといった図形全体の編集を自動化したい方は、関連記事「図形の編集を自動化するエクセルマクロ【マクロの作り方を徹底解析】」も参考にしてみてください。
もし「自分の業務に合わせた複雑なチェック処理を実装したい」「既存のマクロを改良したい」といったご要望がありましたら、マメBlogのエクセルマクロ開発依頼にご相談ください。
業務内容に合わせたオーダーメイドマクロを設定させていただきます。
最後まで読んでいただきありがとうございました。
エクセルVBAを使って面倒なルーティーン作業を自動化しちゃいましょう。







