【VBA】グループ化の解除を全ての図形に対して行う方法

今回は全ての図形に対してグループ化を解除する方法を紹介します。
グループ化の解除は簡単そうに見えて、少し工夫が必要です。

グループ化は1回だけではなく、グループ化された図形をさらにグループ化することができます。
そのためFor Eachループですべての図形のグループ化解除をしても、グループが残ることがあります。
この記事では何重にもグループ化されていてもすべてのグループ化を解除できる方法を紹介します。
すべての図形に対してグループ化を解除する方法
Sub UngroupAllShape()
'''アクティブシート上のすべての図形に対してグループ化を解除
Dim existGroup As Boolean
''existGroupがTrueの間はループ処理する
Do
existGroup = False 'フラグの初期化
Dim oneShp As Shape
For Each oneShp In ActiveSheet.Shapes
''グループ化されているか判定
If oneShp.Type = msoGroup Then
'グループ解除かつフラグをTrueに
oneShp.Ungroup
existGroup = True
End If
Next
''グループ化されたオブジェクトが1つもない⇒ループ処理終了
If existGroup = False Then Exit Do
Loop
End Sub
すべての図形のグループ化を解除するコードはこのようになります。
このコードを実行するとアクティブシート上のすべてのグループ化が解除されます。
グループ化を解除する仕組み
このプログラムのミソはDoループの部分です。
1回ループする度にグループ化されている図形がないかを調べています。
'グループ解除かつフラグをTrueに
oneShp.Ungroup
existGroup = True
そして、グループ化されている図形がある場合はグループ化を解除し、existGroupという変数をTrueにしています。
そして、ここがTrueの場合はもう一度Doループされるようになっています。
最終的にグループ化された図形がなくなり、existGroupがFalseのままとなるとDoループから抜けだす仕組みになっています。
少し長いコードですが、貼り付けるだけで簡単に動くので活用してみてください。