和風スパゲティのレシピ

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

図形がグループ化されているか判定する-Type/Child

図形がグループ化されているか判定する方法を紹介します。

「図形自体がグループであるか」を判定したい場合は、
ShapeオブジェクトのTypeプロパティがmsoGroupかどうかを調べます。


「ある図形がグループ内の図形であるか」を判定したい場合は、
ChildプロパティがmsoTrueどうかを調べます。


その後、グループ内の各図形を取得するにはGroupItemsプロパティを、
親グループを取得するにはParentGroupプロパティをそれぞれ参照します。

図形(Shape)がグループであるか判定する

特定の図形がグループか判定

Dim 指定シェイプ As Shape
Set 指定シェイプ = ActiveSheet.Shapes(1)

If 指定シェイプ.Type = msoGroup Then

    ' ここにグループ図形を選択していた場合の処理
    ' 例:グループ内の各図形への処理
    Dim シェイプ As Shape
    For Each シェイプ In 指定シェイプ.GroupItems
        
        Debug.Print シェイプ.Name
        
    Next

End If

選択図形(Selection)がグループか判定

If Selection.ShapeRange.Type = msoGroup Then

    ' ここにグループ図形を選択していた場合の処理
    ' 例:グループ内の各図形への処理
    Dim シェイプ As Shape
    For Each シェイプ In Selection.ShapeRange.GroupItems
        
        Debug.Print シェイプ.Name
        
    Next

End If

解説

ある図形がグループそのものであるかどうかを判定するには、
ShapeオブジェクトのTypeプロパティがmsoGroupかどうかを調べます。


前提として「Groupオブジェクト」というオブジェクトは存在せず、
グループ全体もShapeオブジェクトで、中身も同じくShapeオブジェクトです。

よってオブジェクトの型では判定することはできませんので、
ShapeのTypeを調べて判定することになります。


対象が選択図形(Selection)の場合はそのままではShapeではありませんので、
ShapeRangeプロパティをかませてからTypeプロパティを取得してください。


対象のShapeがグループと分かった上で中身のShapeを取得するには、
サンプルの通りGroupItemsプロパティをFor Eachで回します。

Dim シェイプ As Shape
For Each シェイプ In グループシェイプ.GroupItems
    
    Debug.Print シェイプ.Name
    
Next

 
ただし「グループの中にグループがある」場合もありますので、
その場合は再帰呼出などで取得する必要が出てきます。

詳細についてはこちらの記事をご参考ください。

www.limecode.jp

ある図形がグループ内の図形であるか判定する

特定の図形がグループ内の1図形か判定

Dim 指定シェイプ As Shape
Set 指定シェイプ = ActiveSheet.Shapes("TextBox 1")

' グループ内のシェイプか判定
If 指定シェイプ.Child = msoTrue Then

    ' 親となるグループシェイプを取得
    Dim 親グループ As Shape
    Set 親グループ = 指定シェイプ.ParentGroup    
    MsgBox 指定シェイプ.Name & "は" & 親グループ.Name & "の内部にあります。"

End If

選択中の図形がグループ内の1図形か判定

' グループ内のシェイプか判定
If Selection.ShapeRange.Child  = msoTrue Then

    ' 親となるグループシェイプを取得
    Dim 親グループ As Shape
    Set 親グループ = Selection.ShapeRange.ParentGroup
    MsgBox Selection.Name & "は" & 親グループ.Name & "の内部にあります。"

End If

解説

ある図形がグループ内の図形であるか判定するには、
ChildプロパティがmsoTrueどうかを調べます。

判定後に親となるグループシェイプを取得する際は、
ParentGroupプロパティで取得してください。


親がない(ChildがFalse)のシェイプでParentGroupプロパティを実行すると、
「指定された値は境界を超えています。」エラーになります。

Nothingが返るわけではないので、必ずChildプロパティで判定しましょう。


なお前述の通り「Groupオブジェクト」なるオブジェクトは存在せず、
グループ全体もShapeオブジェクトで、中身も同じくShapeオブジェクトです。

サンプルの通りParentGroupで取得できるものもShapeオブジェクトですので、
受ける変数もShape型として宣言してください。