'選択した図形の名前を取得
Debug.Print Selection.ShapeRange.Name
'全ての図形の名前を取得'「For Next」のパターン
For i = 1 To ActiveSheet.Shapes.Count
Debug.Print ActiveSheet.Shapes(i).Name '図形の名前を取得
Next
'「For Each Next」のパターン
For Each a In ActiveSheet.Shapes
Debug.Print a.Name '図形の名前を取得
Next
'グループ化した図形内の図形の名前を取得'「For Next」を使うパターン
For i = 1 To ActiveSheet.Shapes("グループ化 1").GroupItems.Count
Debug.Print ActiveSheet.Shapes("グループ化 1").GroupItems(i).Name
Next
'「For Each Next」を使うパターン'グループ化した図形内の図形の名前を取得②
For Each a In ActiveSheet.Shapes("グループ化 1").GroupItems
Debug.Print a.Name '図形の名前を取得
Next
基本的な、図形の名前の取得から解説していきます。
VBAで選択した図形(オートシェイプ)の名前を取得
選択した図形(オートシェイプ)の名前を、VBAで取得するには、「.Name」を使います。
では、やってみます。
Selection.ShapeRange.Nameを使う
選択した図形の名前を取得してみます。
選択した図形をの名前を取得するには、次のようになります。
Sub TEST1()
'選択した図形の名前を取得
a = Selection.ShapeRange.Name
Debug.Print a
End Sub
では、図形を選択します。
図形を選択
では、実行します。
図形の名前を取得
結果は、「図1」となりました。
こんな感じで、図形の名前が取得できます。
VBAでシート内の全ての図形の名前を取得
次は、シート内の全ての図形の名前を、取得してみます。
次の2パターンを使って、図形の名前を取得してみます。
For Nextを使う
For Each Nextを使う
では、取得してみます。
「For Next」で図形の名前を取得
「For Next」を使って、図形の名前を取得してみます。
VBAコードは、こんな感じになります。
Sub TEST2()
'シート内の図形をループ
For i = 1 To ActiveSheet.Shapes.Count
'図形の名前を取得
Debug.Print ActiveSheet.Shapes(i).Name
Next
End Sub
複数の図形を用意しました。
複数の図形を用意
図形の名前は、それぞれ吹き出しに書かれているとおりです。
では、実行してみます。
全ての図形の名前を取得
結果は、「図1、図2、図3、図4」となりました。
全ての図形の名前が取得できています。
「For Each Next」で図形の名前を取得
次は、「For Each Next」を使って、全ての図形の名前を取得してみます。
オブジェクトをつかうので、ちょっと難易度が上がりますけど、理解するとこっちの方が簡単です。
VBAコードは、こんな感じになります。
Sub TEST3()
'シート内の図形をループ
For Each a In ActiveSheet.Shapes
'図形の名前を取得
Debug.Print a.Name
Next
End Sub
では、先ほど使った図形と同じものを使います。
複数の図形を取得
では、実行してみます。
全ての図形の名前を取得
結果は、先ほどと同じで、「図1、図2、図3、図4」となりました。
「For Each Next」を使った方が、VBAコードがシンプルになります。
次からが本題で、グループ化した図形の場合を解説していきます。
VBAでグループ化した図形ではどうなるか
グループ化した図形で、先ほど使ったVBAコードを使って、図形の名前を取得してみます。
グループ名が取得できる
グループ化した図形で、図形の名前を取得すると、「グループ名」が取得できます。
グループ化した図形の中の図形は、取得できません。
先ほど使ったVBAコードです。
Sub TEST4()
'シート内の図形をループ
For Each a In ActiveSheet.Shapes
'図形の名前を取得
Debug.Print a.Name
Next
End Sub
グループ化した図形を用意しました。
第1階層です。
第1階層
第2階層は、こんな感じになっています。
第2階層
では、VBAコードを実行してみます。
第1階層の図形の名前が取得される
結果は、「グループ化 1、グループ化 2」となりました。
「Shapes」でループすると、第1階層の図形の名前が取得されます。
グループ化した図形の中の図形を、取得するには、「GroupItems」を使います。
VBAでグループ化した図形内の図形の名前を取得
本題の、グループ化した図形内の図形の名前を取得するには、「GroupItems」を使います。
「GroupItems」でグループ内の図形を取得
「GropItems」を使って、グループ内の図形を取得してみます。
VBAコードは、こんな感じになります。
Sub TEST5()
'グループ化した図形内の図形をループ
For Each a In ActiveSheet.Shapes("グループ化 1").GroupItems
Debug.Print a.Name '図形の名前を取得
Next
End Sub
Sub TEST6()
'グループ化した図形内の図形をループ
For i = 1 To ActiveSheet.Shapes("グループ化 1").GroupItems.Count
'図形の名前を取得
Debug.Print ActiveSheet.Shapes("グループ化 1").GroupItems(i).Name
Next
End Sub
先ほどと同じグループ化した図形を使います。
第1階層です。
第1階層
第2階層は、こんな感じです。
第2階層
では、VBAコードを実行してみます。
グループ化した図形内の図形の名前を取得
結果は、先ほどと同じで、「図1、図2」となりまりました。
「For Next」の場合だと、若干、VBAコードが長くなっちゃいます。
VBAコードを短くしたい場合は、「For Each Next」を使うといいです。
VBAでグループ化した図形内を含む図形の名前を取得
グループ化した図形内を含む、全ての図形の名前を取得してみます。
全てと言っていますけど、第1階層と第2階層の図形の名前を取得します。
全ての図形の名前を取得
グループ化した図形内を含む、全ての図形の名前を取得するVBAコードは、こんな感じです。
Sub TEST7()
'第1階層の図形をループ
For Each a In ActiveSheet.Shapes
'図形の名前を取得
Debug.Print a.Name
'第2階層の図形のループ
For Each b In a.GroupItems
'図形の名前を取得
Debug.Print b.Name
Next
Next
End Sub
Sub TEST8()
'第1階層の図形をループ
For Each a In ActiveSheet.Shapes
'図形の名前を取得
Debug.Print a.Name
'第2階層の図形のループ
For Each b In a.GroupItems
'図形の名前を取得
Debug.Print b.Name
Next
Next
End Sub
Sub TEST9()
'第1階層の図形をループ
For Each a In ActiveSheet.Shapes
'図形の名前を取得
Debug.Print a.Name
'図形がグループ化しているか判定
If a.Type = msoGroup Then
'第2階層の図形をループ
For Each b In a.GroupItems
'図形の名前を取得
Debug.Print b.Name
Next
End If
Next
End Sub
では、先ほどの図形を使って、名前を取得してみます。
第1階層です。
第1階層
第2階層です。
第2階層
では、実行してみます。
全ての図形の名前を取得
これで、全ての図形を取得できました。
第3階層も取得したい場合は、同じ要領で「For Each」を加えると、取得することができます。
「For Next」でもできる
ちなみに「For Next」を使って、全ての図形をの名前を取得することもできます。
VBAコードは、こんな感じになります。
Sub TEST10()
'第1階層の図形をループ
For i = 1 To ActiveSheet.Shapes.Count
'図形の名前を取得
Debug.Print ActiveSheet.Shapes(i).Name
'図形がグループ化しているか判定
If ActiveSheet.Shapes(i).Type = msoGroup Then
'第2階層の図形をループ
For j = 1 To ActiveSheet.Shapes(i).GroupItems.Count
'図形の名前を取得
Debug.Print ActiveSheet.Shapes(i).GroupItems(j).Name
Next
End If
Next
End Sub
ちょっと長いですけど、やってみます。
第1階層の図形です。
第1階層
第2階層の図形です。
第2階層
では、実行してみます。
全ての図形の名前を取得
結果は、全ての図形の名前を取得できました。
ただ、オブジェクトを使わないでやると、ちょっと長いです。
図形の操作をする際は、「For Each Next」が使えると、便利です。
おわりに
この記事では、グループ化した図形内の、図形の名前を取得する方法について、ご紹介しました。
グループ化した図形内の、図形の名前を取得するには、「GroupItems」を使います。
「For Each Next」を2回使って、図形の中の図形を取得すると、名前を取得することができます。
図形の操作をする際には、「For Each Next」を使うと、VBAコードがシンプルになりますので、便利です。