Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 選択されていない図形・オートシェイプだけを選択するExcelマクロ

選択されていない図形・オートシェイプだけを選択するExcelマクロ

対象:Excel2007, Excel2010, Excel2013

「選択されていないオートシェイプを削除」
という検索で、このサイト・インストラクターのネタ帳へのアクセスがありました。

大量の図形(オートシェイプ)が存在しているときに、一部の図形だけを残して、大部分を削除する方法を探している方による検索です。

削除するほうが少なければ何の問題もありませんが、削除するほうが多いと、確かにかなり面倒です。

「選択されていないオートシェイプを削除」
という検索キーワードでは、どのアプリケーションの話なのかがわかりませんが、とりあえずVBA(Visual Basic for Applications)でExcelマクロを作ってみました。

[スポンサードリンク]

選択されていない図形だけを選択するサンプルマクロ

ワークシート上に、複数の図形が存在していて、いくつかの図形が選択されている状態で以下のマクロを実行すると、選択されていなかった図形だけが選択された状態になります。

Sub 選択されていないShapeだけを選択する()

 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

End Sub

サンプルマクロの解説

まず、選択されているShapeオブジェクトのIDだけのコレクションを作成しておきます。
 Set shp_ids = New Collection
 For Each shp In Selection.ShapeRange
  shp_ids.Add shp.ID

配列でも勿論OKですが、コレクションを使うほうがシンプルなコードになりますので、ここではコレクションを使っています。

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
とすれば、選択されていない図形を削除するマクロになります。

関連語句
VBA, Visual Basic for Applications

[スポンサードリンク]

Home » エクセルマクロ・Excel VBAの使い方 » Shapesコレクション・Shapeオブジェクト » 選択されていない図形・オートシェイプだけを選択するExcelマクロ

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

検索


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

.