和風スパゲティのレシピ

日本語でコーディングするExcelVBA

グループ内の各Shapeを取得する - GroupItems

グループ化されたシェイプの内部にある各図形を取得する方法を解説します。

ShapeオブジェクトのGroupItemsプロパティを、
For Eachステートメントでループして取得します。


※ グループ内にはさらに下層グループが存在する可能性があります。
これを再帰呼出を利用してすべて展開していく処理についてはこちらの記事を参考ください。

基本コード

Dim グループ As Shape
Set グループ = ActiveSheet.Shapes("グループ化 1")

Dim シェイプ As Shape
For Each シェイプ In グループ.GroupItems

    Debug.Print シェイプ.Name
    
Next

解説

グループ化された図形を取得する場合は、
ShapeオブジェクトのGroupItemsプロパティを使用します。

GroupItemsプロパティでグループ内のリストを取得できますので、
あとはそれをFor EachステートメントでループすればOKです。


仕様を理解する上で注意しなければいけないのが、
親であるグループも同じくShapeオブジェクトである点です。

Dim グループ As Shape ' ← これもShapeオブジェクト

Dim グループ As Group ' ← × こんなオブジェクトは存在しない

セルとセル範囲がどちらもRangeオブジェクトであるのと同じような仕様ですね。

親グループもShape型変数にSetしなければいけない点にご注意ください。


そしてもうひとつ注意しなければいけない仕様として、
Excelの図形グループは階層が存在し、
「グループのグループ」といった形で下層グループを作成できます。

よってForEachの中身もまたグループという可能性があり、
これらを取得するには後述の再帰処理が必要になる点にご注意ください。


なお、冒頭でも軽く触れましたが、Excelの図形グループは階層化できるため、
グループ内のShapeもまたグループである可能性があります。

こちらを最深部まで掘り進めて単体Shapeを取得していくには、
フォルダ内のフォルダを展開するときのような再帰処理が必要になります。


この再帰処理の詳しい解説についてはこちらの記事をご覧ください。