図形がグループ化されているか判定する方法を紹介します。
「図形自体がグループであるか」を判定したい場合は、
ShapeオブジェクトのTypeプロパティがmsoGroupかどうかを調べます。
「ある図形がグループ内の図形であるか」を判定したい場合は、
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
ただし「グループの中にグループがある」場合もありますので、
その場合は再帰呼出などで取得する必要が出てきます。
詳細についてはこちらの記事をご参考ください。
ある図形がグループ内の図形であるか判定する
特定の図形がグループ内の1図形か判定
Dim 指定シェイプ As Shape Set 指定シェイプ = ActiveSheet.Shapes("TextBox 1") On Error Resume Next ' エラースキップ下で親グループを取得してみる Dim 親グループ As Shape Set 親グループ = 指定シェイプ.ParentGroup 指定シェイプに親グループが存在した場合 If Err.Number = 0 Then MsgBox 指定シェイプ.Name & "は" & 親グループ.Name & "の内部にあります。" End If On Error GoTo 0
選択中の図形がグループ内の1図形か判定
' エラースキップ下で親グループを取得してみる Dim 親グループ As Shape Set 親グループ = Selection.ShapeRange.ParentGroup ' 親グループがあった場合 If Err.Number = 0 Then MsgBox Selection.Name & "は" & 親グループ.Name & "の内部にあります。" ' 親グループがない場合 Else MsgBox "選択図形には親グループはありません。" End If
解説
ある図形がグループ内の図形であるか判定するには、
ParentGroupプロパティが取得できるか(エラーになるか)どうかを調べます。
ParentGroupは親グループをShapeオブジェクトとして取得するプロパティで、
これを変数にSetするコードがエラーかどうかで親グループの存在を判定できます。
前述の通り「Groupオブジェクト」なるオブジェクトは存在せず、
グループ全体もShapeオブジェクトで、中身も同じくShapeオブジェクトです。
サンプルの通りParentGroupで取得できるものもShapeオブジェクトですので、
受ける変数もShape型として宣言してください。