大体でIT

-ちょっと使えるネタを紹介-

大体でIT

Excel VBAで、グループ化した図形内の、図形の名前を取得する方法について、ご紹介します。グループ化した図形内の図形は、「GroupItems」を使います。やり方は、「For Each Next」を2回ループして、図形の中の図形を取得して、名前を取得するという流れです。具体的に解説していきます。

はじめに

この記事では、グループ化した図形内の、図形の名前を取得する方法について、ご紹介します。

グループ化した図形内の、図形の名前を取得するには、「GroupItems」です。

「For Each Next」を2回使って、図形の中の図形を取得して、名前を取得する流れになります。

図形の操作をする際には、「For Each Next」を使うと、VBAコードがシンプルになりますので、便利です。

では、グループ化した図形中の、図形の名前を取得する方法について、解説していきます。

この記事で紹介すること

  • グループ化した図形内の、図形の名前を取得する方法

目次から見たい項目へ移動すると便利ですよ。

目次

VBAコードまとめ

図形の名前を取得するVBAコードを、まとめました。

VBAコードだけ確認したい場合に、ご活用ください。

'選択した図形の名前を取得
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

では、先ほど使った図形と同じものを使います。

複数の図形を取得

複数の図形を用意

では、実行してみます。

全ての図形の名前を取得

For Each Nextを使って全ての図形の名前を取得した結果

結果は、先ほどと同じで、「図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

グループ化した図形を用意しました。

第1階層です。

第1階層

グループ化した図形を用意

第2階層は、こんな感じになっています。

第2階層

グループ化した図形の中の図形の名前

では、VBAコードを実行してみます。

グループ化した図形内の図形の名前を取得

グループ化した図形の中の図形の名前を取得した結果

結果は、「図1、図2」となりました。

グループ化した図形内の、図形の名前を、取得できました。

こんな感じで、グループ化した図形内の、図形の名前を取得するには、「GroupItems」を使います。

「For Next」でもできる

もちろん、「For Next」でも同じように、グループ化した図形内の、図形の名前を取得できます。

VBAコードは、こんな感じになります。

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

グループ化した図形を用意しました。

第1階層です。

第1階層

グループ化した図形を用意

第2階層です。

第2階層

グループ化した図形の中の図形

では、実行してみます。

全ての図形の名前を取得

グループ化した図形内を含む、全ての図形の名前を取得した結果

結果は、「グループ化 1、図1、図2、グループ化 2、図3、図4」となりました。

全ての図形の名前を取得できています。

図形が全てグループ化していると、簡単です。

しかし、グループ化していない図形があると、今回のVBAコードでは、エラーとなってしまいます。

やってみます。

グループ化していない図形を追加

グループ化していない図形を追加して、グループ化した図形の中を含む、全ての図形の名前を取得してみます。

VBAコードは、先ほどと同じです。

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

グループ化していない図形の「図5」を追加しました。

第1階層です。

第1階層

グループ化していない図形を追加

第2階層です。

第2階層

第2階層

では、VBAコードを実行してみます。

グループ化してない図形でエラー

エラーとなる
エラーとなる

エラーとなっちゃいました。

グループ化していない図形に対して、「GroupItems」を使うとエラーとなっちゃうんですね。

なので、グループ化した図形については、「グループ化した図形の場合」という条件を付けて、名前を取得します。

【完成】グループ化している条件を加える

グループ化している場合だけ、グループ化した図形内の図形を含む、図形を取得してみます。

「If a.Type = msoGroup Then」の条件をつけます。

VBAコードは、こんな感じになります。

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階層

第1階層の図形

第2階層です。

第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階層

第1階層の図形

第2階層の図形です。

第2階層

第2階層の図形

では、実行してみます。

全ての図形の名前を取得

グループ化した図形内の図形を含む、全ての図形の名前を取得した結果

結果は、全ての図形の名前を取得できました。

ただ、オブジェクトを使わないでやると、ちょっと長いです。

図形の操作をする際は、「For Each Next」が使えると、便利です。

おわりに

この記事では、グループ化した図形内の、図形の名前を取得する方法について、ご紹介しました。

グループ化した図形内の、図形の名前を取得するには、「GroupItems」を使います。

「For Each Next」を2回使って、図形の中の図形を取得すると、名前を取得することができます。

図形の操作をする際には、「For Each Next」を使うと、VBAコードがシンプルになりますので、便利です。

参考になればと思います。最後までご覧くださいまして、ありがとうございました。

関連する記事から探す

カテゴリから探す

カテゴリから見たい項目を探すと便利ですよ。

サイト内を検索する

↓キーワードを入力する

アーカイブから探す