VBAで図をグループ化する方法(VBAで図を操る②)

2021年3月20日

VBAの図って、セル(Range)と比べると扱い方が難しいですよね。

そんな扱いづらい図ですが、操作方法は限られているのでコードを数パターン覚えておけば後は応用が利きます。(基本的にShapesコレクションからShapeオブジェクトを取り出す)

今回は図をグループ化する方法を紹介します。

  1. シート内の全ての図をグループ化
  2. 【応用】範囲内の図だけをグループ化

の2つを紹介するのでVBAでグループ化をしたい人は参考にしてみてください。

シート内の全ての図をグループ化

Sub ShpGroup()
'ActiveSheet上の図をすべてグループ化
    
    On Error GoTo ErrorTrap '図が1つだとエラーとなる
    ActiveSheet.Shapes.SelectAll
    Selection.Group
    Exit Sub
    
ErrorTrap:
    MsgBox "グループ化するには2つ以上のシェイプが必要です、"
End Sub

ActiveSheet.Shapes.SelectAllでシート上のすべての図を選択し、
Selection.Groupで選択した図をグループ化しています。

図が1つだとグループ化に失敗するため、On Error GoToを入れておくことを推奨します。

【応用①】範囲内の図だけをグループ化

Sub RngShpGroup()
'範囲内(rng)の図をすべてグループ化
    On Error GoTo ErrorTrap '図が1つだとエラーとなる
    Dim rng As Range: Set rng = Range("A1:Z20")
    Dim rightRng As Single: rightRng = rng.Left + rng.Width
    Dim bottomRng As Single: bottomRng = rng.Top + rng.Height
    Dim shp As Shape
    For Each shp In ActiveSheet.Shapes
        Dim shpRight As Single: shpRight = shp.Left + shp.Width
        Dim shpBottom As Single: shpBottom = shp.Top + shp.Height
        
        'shpがrng内か判定
        If rng.Left < shp.Left And rightRng > shpRight And _
           rng.Top < shp.Top And bottomRng > shpBottom Then
           shp.Select (False) 'False:複数選択可
        End If
    Next
    Selection.Group: Exit Sub
    
ErrorTrap:
    MsgBox "グループ化するには2つ以上のシェイプが必要です、"
End Sub

上のプログラムではrngの範囲内にある図だけをグループ化することができます。
このプログラムではサンプルとして具体的な範囲(A1:Z20)にしていますが、この範囲を変更しても使えます。

        'shpがrng内か判定
        If rng.Left < shp.Left And rightRng > shpRight And _
           rng.Top < shp.Top And bottomRng > shpBottom Then
           shp.Select (False) 'False:複数選択可
        End If

このIf文でshpがrng内に含まれるかどうか判定しています。

rngの上下左右の座標とshpの上下左右の座標をすべて取得することで内側にあるかどうか判定しています。

【応用②】特定の図のみグループ化

ShapeオブジェクトのTypeプロパティを判定することで、特定の図のみグループ化することも可能です。

Typeプロパティの使い方については、こちらの記事をご覧ください。

他の「VBAで図を操る」の記事はこちらからどうぞ