Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 図形を一括削除するExcelマクロ

対象:Excel2007, Excel2010, Excel2013

「excel vba 図形を一度に消すには?」
という検索が、このサイト・インストラクターのネタ帳で行われていました。

図形を一気に削除するExcelマクロ・VBA(Visual Basic for Applications)のコードを探している方による検索です。

選択したセル範囲に含まれる図形を削除するExcelマクロを既にご紹介していますが、全図形を一気に削除するマクロをご紹介します。

アクティブシート上の図形を一括削除するサンプルマクロ

以下のようなマクロで、アクティブなシート上の図形を一気に削除することができます。

Sub アクティブシート上の図形を一括削除する()
 Dim shp As Shape
 For Each shp In ActiveSheet.Shapes
  shp.Delete
 Next
End Sub

アクティブなシート上の全図形にループを回して、
  For Each shp In ActiveSheet.Shapes

1つずつ順番に削除しています。
   shp.Delete

アクティブなブックの全ワークシートの図形を一括削除するサンプルマクロ

以下のようなマクロにすれば、アクティブなブックの全ワークシート上の図形を一気に削除することができます。

Sub アクティブブックの全ワークシートの図形を一括削除する()
 Dim ws As Worksheet
 For Each ws In ActiveWorkbook.Worksheets

  Dim shp As Shape
  For Each shp In ws.Shapes
   shp.Delete
  Next shp

 Next ws
End Sub

アクティブなワークブックの、全ワークシートにループを回して、
 For Each ws In ActiveWorkbook.Worksheets

各ワークシート上の全図形にループを回して、
  For Each shp In ws.Shapes

順番に図形を削除しています。
   shp.Delete

アクティブシート上の図形をループ処理しないで一括削除するサンプルマクロ

Excelマクロを作り始めたばかりの方は、まずは、上記のようなループ処理をスラスラ書けるようになりましょう。

逆に、マクロを作り慣れてきた方や、Excelのことをあまりご存知ないけれどプログラミングの経験があるのでとりあえずExcelマクロも作れてしまう方の場合、ループを回す必要のない処理までループを回してしまうという傾向があります。

今回ご紹介した図形の一括削除も、実は、ループを使わないマクロにすることができます。

Sub 図形を回さずアクティブシート上の図形を一括削除する()
 ActiveSheet.Shapes.SelectAll
 Selection.Delete
End Sub

図形の一括削除については、先にご紹介したFor Each ~ Next文でいいと思いますが、上記のようなループなしでも処理できてしまいます。

特にExcelマクロを作り慣れている方に向けて、私がこのコードをどうやって考えたのかを書いておきます。

Excelマクロをまだ作り慣れていない方、For Each ~ Next文をスラスラ書けないレベルの方は、読まないほうがいいと思います。

まず、全図形を表すShapesコレクションオブジェクトに、Deleteメソッドが存在していないかを調べました。

図形を一括削除するExcelマクロ

オブジェクトブラウザーで確認すると、上図のようにShapes.Deleteメソッドは存在していないことがわかります。

次に、複数の図形を表すShapeRangeオブジェクトにDeleteメソッドがないかを調べました。

図形を一括削除するExcelマクロ

すると上図のように、ShapeRangeオブジェクトには、Deleteメソッドが存在していることがわかります。

ですから、何らかの方法で全図形を表すShapeRangeオブジェクトを取得できれば、ShapeRangeオブジェクトのDeleteメソッドで、ループ処理なしで全図形を削除できることがわかります。

ここであらためて、全図形を表すShapesコレクションオブジェクトを確認すると、下図のとおり、SelectAllメソッドが存在していることがわかります。

図形を一括削除するExcelマクロ

つまり、Shapes.SelectAllメソッドを使うと、ループを回さずに、すべての図形を選択できるわけです。

ここで、Shapes.SelectAllメソッドがShapeRangeオブジェクトを返すFunctionプロシージャになっていれば、
 ActiveSheet.Shapes.SelectAll.Delete
というコードで全選択から削除までを一気に処理できることになります。

が、Shapes.SelectAllメソッドは何も返さないSubプロシージャですので、一気に削除まではできません。

そこで、
 ActiveSheet.Shapes.SelectAll
で全図形を選択しておいてから、
 Selection.Delete
とSelectionプロパティで選択されているShapeRangeオブジェクトを取得して、

図形を一括削除するExcelマクロ

ShapeRange.Deleteメソッドで削除するというマクロにしました。

Excel側に一括処理するコマンドが存在している場合、VBA側ではループを回さなくても処理できる可能性は高いので、ループ処理をスラスラ書けるレベルの方は、ループを回さずに処理できないかを考えてみるクセを、少しずつつけていくとより速いマクロが作れるようになったり、Excelのオブジェクト構造に対する理解が深まっていくはずです。

最終更新日時:2021-12-14 13:41

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 図形を一括削除するExcelマクロ

「Shapesコレクション・Shapeオブジェクト」の記事一覧

検索


Copyright © インストラクターのネタ帳 All Rights Reserved.

.