shikumika’s diary

日々の事務作業で手間なことを簡単にできる仕組み(自動化、方法など)、困ったことの解決方法を調べた備忘録

【Excel VBA】選択しているオブジェクトと同じタイプを一括で選択

Excelで図形を操作するときに、同じタイプのオブジェクトを一括で選択したい場合があります。例えば、シート内にあるすべての「コネクタ: カギ線」だけを選択したり、「テキスト ボックス」だけを選択して色を変更したいときなどです。

しかし、Excelにはそのような機能はありません。

シート内の全てのオブジェクトを選択することは可能ですが、オブジェクトのタイプを絞り込んで一括で選択することはできません。

そのため、Ctrlキーを押しながら一つずつ選択を繰り返す方法となり、オブジェクトが多い場合は手間です。

そこで、VBAを使って、現在選択しているオブジェクトと同じタイプのオブジェクトを全て選択するコードの備忘録です。

内容:

事例の前提

  • Excelのアクティブなシート内で、一括選択したいオブジェクトのタイプを一つ選択しておく。
    例:「コネクタ: カギ線」だけを選択したい場合は、そのオブジェクトを一つ。
  • VBAで、選択しているオブジェクトと同じタイプのオブジェクトを全て選択する。
  • 同じタイプの判定は、次の「図形の種類を表す MsoShapeType 値」で判定しており、「オートシェイプ」は同じタイプになる。

    learn.microsoft.com

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を作成しようとした背景は、業務フローの作成時に以下で線(コネクタ)の色等の変更(後からの修正)が手間であったためでした。

shikumika.org

私の用途では、コネクタ部分以外にオートシェイプがなかったので、目的とする一括選択ができました。

もし、詳細なタイプ分けが必要な場合はコード修正が必要です。

詳細なタイプ分け時の参考情報

いくつか「オートシェイプ」が混在しているなどの場合は、Shape.AutoShapeType プロパティConnectorFormat.Type プロパティなど、他のプロパティでの分類が必要。もしくは、Selection.Nameで分類した方が容易な印象

もし、「オートシェイプ」のプロパティでタイプ分けをしたい場合は、MsoAutoShapeType 列挙を利用し、Shape.AutoShapeType プロパティで判定する。ただし、「選択しているオブジェクトと同じタイプ」という汎用的なものでなく、用途限定のコードで指定した方が良さそう。

learn.microsoft.com

なお、「コネクタ」はMsoShapeTypeで「オートシェイプ」に分類されるが、MsoAutoShapeTypeに「コネクタ」としての分類はない。msoShapeMixedに分類され、Shape.AutoShapeType プロパティで”-2”が返る。

また、コネクタ部分での分類であれば、MsoConnectorType 列挙を利用して、ConnectorFormat.Type プロパティで判定する。

learn.microsoft.com

以上、Excel VBAで、同じタイプのオブジェクトを一括で選択する方法でした。