「excel vba 図形を一度に消すには?」
という検索が、このサイト・インストラクターのネタ帳で行われていました。
図形を一気に削除するExcelマクロ・VBA(Visual Basic for Applications)のコードを探している方による検索です。
選択したセル範囲に含まれる図形を削除するExcelマクロを既にご紹介していますが、全図形を一気に削除するマクロをご紹介します。
アクティブシート上の図形を一括削除するサンプルマクロ
以下のようなマクロで、アクティブなシート上の図形を一気に削除することができます。
Dim shp As Shape
For Each shp In ActiveSheet.Shapes
shp.Delete
Next
End Sub
アクティブなシート上の全図形にループを回して、
For Each shp In ActiveSheet.Shapes
1つずつ順番に削除しています。
shp.Delete
アクティブなブックの全ワークシートの図形を一括削除するサンプルマクロ
以下のようなマクロにすれば、アクティブなブックの全ワークシート上の図形を一気に削除することができます。
Dim ws As Worksheet
For Each ws In ActiveWorkbook.Worksheets
Dim shp As Shape
For Each shp In ws.Shapes
shp.Delete
Next shp
End Sub
アクティブなワークブックの、全ワークシートにループを回して、
For Each ws In ActiveWorkbook.Worksheets
各ワークシート上の全図形にループを回して、
For Each shp In ws.Shapes
順番に図形を削除しています。
shp.Delete
アクティブシート上の図形をループ処理しないで一括削除するサンプルマクロ
Excelマクロを作り始めたばかりの方は、まずは、上記のようなループ処理をスラスラ書けるようになりましょう。
逆に、マクロを作り慣れてきた方や、Excelのことをあまりご存知ないけれどプログラミングの経験があるのでとりあえずExcelマクロも作れてしまう方の場合、ループを回す必要のない処理までループを回してしまうという傾向があります。
今回ご紹介した図形の一括削除も、実は、ループを使わないマクロにすることができます。
ActiveSheet.Shapes.SelectAll
Selection.Delete
End Sub
図形の一括削除については、先にご紹介したFor Each ~ Next文でいいと思いますが、上記のようなループなしでも処理できてしまいます。
特にExcelマクロを作り慣れている方に向けて、私がこのコードをどうやって考えたのかを書いておきます。
まず、全図形を表すShapesコレクションオブジェクトに、Deleteメソッドが存在していないかを調べました。
オブジェクトブラウザーで確認すると、上図のようにShapes.Deleteメソッドは存在していないことがわかります。
次に、複数の図形を表すShapeRangeオブジェクトにDeleteメソッドがないかを調べました。
すると上図のように、ShapeRangeオブジェクトには、Deleteメソッドが存在していることがわかります。
ですから、何らかの方法で全図形を表すShapeRangeオブジェクトを取得できれば、ShapeRangeオブジェクトのDeleteメソッドで、ループ処理なしで全図形を削除できることがわかります。
ここであらためて、全図形を表すShapesコレクションオブジェクトを確認すると、下図のとおり、SelectAllメソッドが存在していることがわかります。
つまり、Shapes.SelectAllメソッドを使うと、ループを回さずに、すべての図形を選択できるわけです。
ここで、Shapes.SelectAllメソッドがShapeRangeオブジェクトを返すFunctionプロシージャになっていれば、
ActiveSheet.Shapes.SelectAll.Delete
というコードで全選択から削除までを一気に処理できることになります。
が、Shapes.SelectAllメソッドは何も返さないSubプロシージャですので、一気に削除まではできません。
そこで、
ActiveSheet.Shapes.SelectAll
で全図形を選択しておいてから、
Selection.Delete
とSelectionプロパティで選択されているShapeRangeオブジェクトを取得して、
ShapeRange.Deleteメソッドで削除するというマクロにしました。
Excel側に一括処理するコマンドが存在している場合、VBA側ではループを回さなくても処理できる可能性は高いので、ループ処理をスラスラ書けるレベルの方は、ループを回さずに処理できないかを考えてみるクセを、少しずつつけていくとより速いマクロが作れるようになったり、Excelのオブジェクト構造に対する理解が深まっていくはずです。
最終更新日時:2021-12-14 13:41
Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 図形を一括削除するExcelマクロ