はじめに
シェイプ(図形)を配置すると自動で名前が割り振られます。この割り振られた名前をプログラムで取得してみましょう。 今回は「マクロの記録」からヒントを得てシェイプの名前を取得していく方法を紹介します。
シート上にあるシェイプ(図形)は、1個でも配列として取得する事になります。少々複雑ですが順を追って解説します。

マクロの記録でシェイプを追加
マクロの記録を起動して、適当にシェイプを追加してみましょう。以下はシート上に1個の楕円を追加した際のコードになります。(コメント部分はカットしています。)
Sub Macro1()
ActiveSheet.Shapes.AddShape(msoShapeOval, _
49.75, 13.9166929134, _
48.9166929134, 15.75).Select
End Sub
上記のようなマクロが出力されました。
AddShapeでシェイプが追加されています。
5つの引数がありますが、それぞれ図形の名前、左、上、幅、高さとなっています。
シェイプの追加についての詳細は以下のページを参照してください。
・VBAで(図形)オートシェイプを追加
注目すべきは、その前のShapesです。
最後に s が付いて複数形になっているので、これが配列(コレクション)であることがわかります。
※コレクションとはオブジェクトの配列の事です。
なので上記のプログラムは、シェイプの配列(コレクション)に新しい図形を追加しているという事になります。
シェイプの名前を表示する
今度は、シェイプの配列から、アクティブなシートにあるシェイプの名前を表示させるプログラムを書いてみます。
Sub myShapesName()
Debug.Print ActiveSheet.Shapes.Count 'シェイプの数を得る
Dim i As Long
For i = 1 To ActiveSheet.Shapes.Count
Debug.Print ActiveSheet.Shapes(i).Name
Next i
End Sub
まず、シェイプの数をカウントしています。 ActiveSheet.Shapes が配列なので、Count プロパティで配列の数(つまりシェイプの数)を取得できます。
For文を使って一つづつ図形の名前を表示させていきます。
ActiveSheet.Shapes(i).Name
Shapes(i)として1個のシェイプを取り出して、Nameプロパティで名前を取得できます。
コレクションの場合は、For Each を使った書き方もできます。
Sub myShapesName2()
Dim shp
For Each shp In ActiveSheet.Shapes
Debug.Print shp.Name
Next shp
End Sub
こちらの方が見た目がすっきりしていますが、どちらを使っても構いません。
選択されたシェイプの名前を表示する
シート上のシェイプが複数ある場合、特定のシェイプの名前を知りたい場合は、選択されたシェイプの名前を表示するようにすれば良いでしょう。
'選択されたシェイプの名前
Sub mySelectionShapesName()
If Selection.ShapeRange.Count < 1 Then Exit Sub
Dim i As Long
For i = 1 To Selection.ShapeRange.Count
Debug.Print Selection.ShapeRange(i).Name
Next i
End Sub
選択されたシェイプは Selection.ShapeRange で取得できます。
このコードでは最初に選択されたシェイプの数を取得して、選択されたシェイプが無い場合は処理を抜けています。このコードが無いと選択されたシェイプ無い場合エラーになります。
一つだけ選択されているシェイプの名前を取得したい場合は、以下の様に書く事もできます。
この場合でも選択されたシェイプが0でないか確認しないとエラーとなります。もし、複数選択されたシェイプがある場合は、最初に選択されたシェイプの名前が表示されます。
'選択されたシェイプの名前(単体)
Sub mySelectionShapeName()
If Selection.ShapeRange.Count < 1 Then Exit Sub
Debug.Print Selection.ShapeRange(1).Name
End Sub
シェイプの名前で選択する
特定のシェイプをシェイプ名で指定できると便利です。上記のプログラムで名前の特定ができので取得したいシェイプをシェイプ名で選択してみましょう。
Sub selectMyShape1()
ActiveSheet.Shapes("Oval 1").Select
End Sub
一方、マクロの記録でシェイプを選択すると、以下のようなコードが出てきます。
Sub Macro2()
ActiveSheet.Shapes.Range(Array("Oval 1")).Select
End Sub
RangeプロパティにArrayで配列を指定しています。少々難しそうな書き方ですが、マクロの記録で出てくるこのコードは、2つ以上のシェイプを選択する時にも使う事ができる書き方です。
ActiveSheet.Shapes.Range(Array(“Oval 1”, “Oval 2”, “Oval 3”)).Select
色々な状況に対応できるので、この書き方の方が有効だと言われています。
まとめ
今回は、シート上のシェイプの名前を取得する方法と、シェイプ名でシェイプを選択する方法を解説しました。
シート上にあるシェイプ(図形)は、1個でも配列として取得するという点に注意しましょう。また、選択する際は、選択されたシェイプが0より大きい事を確認しないとエラーになるので、この点にも注意してください。
また、複数のシェイプを選択する時は、以下のようにRangeプロパティにArrayで指定する以下のような書き方になります。
ActiveSheet.Shapes.Range(Array(“Oval 1”, “Oval 2”, “Oval 3”)).Select
この書き方は、単体の場合も複数の場合も使えるので覚えておくと便利です。