VBAで図形に干渉したい場合は、ワークシートなどのオブジェクトにShapesプロパティを付けて、「シートの中のオブジェクト群」であるShapesコレクションを取得して使います。
Shapesコレクションに引数を付けることで、個別の図形=Shapeオブジェクトが取得できます。
Shapesコレクション(すべての図形)
オブジェクト.Shapes.SelectAll
まず3つ図形を用意しておきます。
ActiveSheet.Shapesと記述します。この時点で、「アクティブシートの図形全て」が選択されている状態です。「アクティブシートの図形全て」に対して命令を実行できるので、これを対象としてShapesコレクションと呼びます。
' vba
ActiveSheet.Shapes.SelectAll
Selectメソッドは個別のオブジェクトを選択する命令で、この場合使えません。
Shapeオブジェクト(個別の図形)
オブジェクト.Shapes(図形の名称または番号).Select
' vba
ActiveSheet.Shapes(1).Select
引数はインデックス番号でも図形を選択できますし、図形の名前などでも指定できます。
Shapes(1, 2).Selectなど)はエラーになります。複数図形を選択したい場合は、Shapesコレクションに対して後述するRangeを使い
ActiveSheet.Shapes.Range(Array(1, 2)).Selectのように記述します。図形のインデックス番号
同じコード(
ActiveSheet.Shapes(1).Select)でもこの状態なら〇が選択され、図形の名前
' vba
ActiveSheet.Shapes("maru").Select
""で囲って名前を指定することでも、図形の取得が可能です。ShapeRangeコレクション(複数図形)
Shapesコレクションはシート上の図形全て、Shapeオブジェクトは単一の図形を意味し、これとは別に「複数の図形の範囲」を意味するShapeRangeコレクションというのもあります。
ShapeRangeコレクションは①図形みっつのうちふたつを選択したいとか、②図形全体のプロパティを変更する場合などに使用します。Shapesコレクションからはプロパティを変更できないので、一度ShapeRangeコレクションにする必要があります。
ShapeRangeプロパティ
失敗例①Shapesコレクションに対してShapeRangeプロパティを直接付けると、
Shapes.SelectAllで図形全体を選択して一度命令を閉じ、次の行でSelectionから命令することで対応します。②ShapeRangeを付けてない(ShapesコレクションからFill.ForeColorを実行しようとしている)のでこれもエラーになります。
' vba
' 図形全体を選択
ActiveSheet.Shapes.SelectAll
' 選択済の図形の色を変更
Selection.ShapeRange.Fill.ForeColor.RGB = RGB(100, 100, 100)
Rangeプロパティ
' vba
' インデクス番号2、3の図形の色を変える
ActiveSheet.Shapes.Range(Array(2, 3)).Fill.ForeColor.RGB = RGB(0, 0, 255)
Shapesコレクションに対してRangeプロパティを付け、Array()の中で図形のインデクス番号や名称を指定することで取得します。
取得した図形に対してできること
ShapesコレクションやShapeオブジェクトに対して、たとえば以下のようなことができます。基本プロパティはShapesコレクションからは行えないので、適宜ShapeRangeコレクションから操作します。
他にも色々な命令があるので、より詳しく知りたい方は下記をご参照ください。

コメント
こんにちは、すなぎつ様
私は宮腰と申します。
アリーナ照明の保守用にエクセル図面で水銀灯の不良箇所チェック表を作りました。
下記、構文でいろんな色の「○」図形が多数有ります。
この色及び透明度の図形をマクロで選択し個数をカウント出来るのでしょうか。
ヒントを頂ければ幸いです。
よろしくお願いいたします。
Sub 選択図形の塗りつぶし黒色() ‘黒色
On Error GoTo ErrHandl
With Selection.ShapeRange.Fill
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0.6
.Solid
End With
Exit Sub
ErrHandl:
MsgBox “外したい電球を選択してから実行してください。”
Err.Clear
End Sub
宮腰様
コメントありがとうございます。たとえば下記のようなコードで該当図形の数は数えられると思いますが、いかがでしょうか。
Sub 電球カウント()
Dim 図形の数
Dim count: count = 0
図形の数 = ActiveSheet.Shapes.count
For i = 1 To 図形の数
If ActiveSheet.Shapes.Range(Array(i)).Fill.Visible = msoTrue And _
ActiveSheet.Shapes.Range(Array(i)).Fill.ForeColor.RGB = RGB(0, 0, 0) And _
ActiveSheet.Shapes.Range(Array(i)).Fill.Transparency = 0.6 Then
count = count + 1
End If
Next
MsgBox count
End Sub