Excelで図形を操作するときに、同じタイプのオブジェクトを一括で選択したい場合があります。例えば、シート内にあるすべての「コネクタ: カギ線」だけを選択したり、「テキスト ボックス」だけを選択して色を変更したいときなどです。
しかし、Excelにはそのような機能はありません。
シート内の全てのオブジェクトを選択することは可能ですが、オブジェクトのタイプを絞り込んで一括で選択することはできません。
そのため、Ctrlキーを押しながら一つずつ選択を繰り返す方法となり、オブジェクトが多い場合は手間です。
そこで、VBAを使って、現在選択しているオブジェクトと同じタイプのオブジェクトを全て選択するコードの備忘録です。
内容:
事例の前提
- Excelのアクティブなシート内で、一括選択したいオブジェクトのタイプを一つ選択しておく。
例:「コネクタ: カギ線」だけを選択したい場合は、そのオブジェクトを一つ。 - VBAで、選択しているオブジェクトと同じタイプのオブジェクトを全て選択する。
- 同じタイプの判定は、次の「図形の種類を表す MsoShapeType 値」で判定しており、「オートシェイプ」は同じタイプになる。
VBAサンプル
Sub 同じタイプの図形選択() Dim 図形 As Shape Dim 選択した図形タイプ As MsoShapeType '選択しているオブジェクトのタイプを取得' 選択した図形タイプ = ActiveSheet.Shapes(Selection.Name).Type '同じタイプのオブジェクトを選択' For Each 図形 In ActiveSheet.Shapes If 図形.Type = 選択した図形タイプ Then 図形.Select Replace:=False End If Next 図形 End Sub
事例の補足説明
注意点
このコードは、選択するオブジェクトは一つのみで、複数選択やShapeオブジェクト以外のものを選択している場合には対応していません。
また「オートシェイプ」に該当するオブジェクトは同じタイプと判定する仕様です。
今回、VBAを作成しようとした背景は、業務フローの作成時に以下で線(コネクタ)の色等の変更(後からの修正)が手間であったためでした。
私の用途では、コネクタ部分以外にオートシェイプがなかったので、目的とする一括選択ができました。
もし、詳細なタイプ分けが必要な場合はコード修正が必要です。
詳細なタイプ分け時の参考情報
いくつか「オートシェイプ」が混在しているなどの場合は、Shape.AutoShapeType プロパティやConnectorFormat.Type プロパティなど、他のプロパティでの分類が必要。もしくは、Selection.Nameで分類した方が容易な印象。
もし、「オートシェイプ」のプロパティでタイプ分けをしたい場合は、MsoAutoShapeType 列挙を利用し、Shape.AutoShapeType プロパティで判定する。ただし、「選択しているオブジェクトと同じタイプ」という汎用的なものでなく、用途限定のコードで指定した方が良さそう。
なお、「コネクタ」はMsoShapeTypeで「オートシェイプ」に分類されるが、MsoAutoShapeTypeに「コネクタ」としての分類はない。msoShapeMixedに分類され、Shape.AutoShapeType プロパティで”-2”が返る。
また、コネクタ部分での分類であれば、MsoConnectorType 列挙を利用して、ConnectorFormat.Type プロパティで判定する。
以上、Excel VBAで、同じタイプのオブジェクトを一括で選択する方法でした。