「選択されていないオートシェイプを削除」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。
大量の図形(オートシェイプ)が存在しているときに、一部の図形だけを残して、大部分を削除する方法を探している方による検索です。
削除するほうが少なければ何の問題もありませんが、削除するほうが多いと、確かにかなり面倒です。
「選択されていないオートシェイプを削除」
という検索キーワードでは、どのアプリケーションの話なのかがわかりませんが、とりあえずVBA(Visual Basic for Applications)でExcelマクロを作ってみました。
選択されていない図形だけを選択するサンプルマクロ
ワークシート上に、複数の図形が存在していて、いくつかの図形が選択されている状態で以下のマクロを実行すると、選択されていなかった図形だけが選択された状態になります。
Dim shp As Shape
Dim shp_ids As Collection
Dim shp_id As Variant
Dim is_select As Boolean
If TypeName(Selection) = "Range" Then Exit Sub
Set shp_ids = New Collection
For Each shp In Selection.ShapeRange
shp_ids.Add shp.ID
Next shp
Range("a1").Select
For Each shp In ActiveSheet.Shapes
is_select = False
For Each shp_id In shp_ids
If shp_id = shp.ID Then
is_select = True
Exit For
End If
Next shp_id
If Not is_select Then shp.Select Replace:=False
Next shp
サンプルマクロの解説
まず、選択されているShapeオブジェクトのIDだけのコレクションを作成しておきます。
Set shp_ids = New Collection
For Each shp In Selection.ShapeRange
shp_ids.Add shp.ID
Shapeの選択状態を解除するために、一旦セルを選択しておいてから、
Range("A1").Select
アクティブなシート上の全ShapeにFor Each~Nextループを回してチェックを開始します。
For Each shp In ActiveSheet.Shapes
is_select = False
アクティブシート上のShapeが、元々選択されていた図形かどうかをチェックして、
For Each shp_id In shp_ids
If shp_id = shp.ID Then
is_select = True
Exit For
元々選択されていた図形でなかったときに選択を行っています。
If Not is_select Then shp.Select Replace:=False
また、そもそもShapeが選択されていないときは、処理を行わないように、最初に以下のIf文を入れてあります。
If TypeName(Selection) = "Range" Then Exit Sub
アクティブシート上に画像がある場合
オートシェイプ(図形)だけでなく、画像があった場合、上記のマクロは画像も処理対象とします。
画像があったときは画像は処理対象から外したいという場合は、アクティブシート上の全Shapeに対するFor Each~Nextの開始行
For Each shp In ActiveSheet.Shapes
の下に、
If shp.Type = msoPicture Then Exit For
を入れて、
For Each shp In ActiveSheet.Shapes
If shp.Type = msoPicture Then Exit For
is_select = False
For Each shp_id In shp_ids
としてください。
削除まで行いたい場合
ここでは、とりあえず選択されていなかった図形だけを選択するマクロをご紹介しましたが、
「選択されていないオートシェイプを削除」
という検索キーワードどおり、本当に削除まで行っていいのならば、上記のマクロで選択を行っている、
If Not is_select Then shp.Select Replace:=False
の部分を、
If Not is_select Then shp.Delete
とすれば、選択されていない図形を削除するマクロになります。
Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 選択されていない図形・オートシェイプだけを選択するExcelマクロ