VBAで図形をグループ化する方法

2021年11月27日

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が難しいと感じたら
プロにお任せして代わりに作ってもらってはいかがでしょう?
VBAの作成依頼はこちらから

《VBA中級者向けの本》
VBA上級者を目指したい人にはパーフェクトExcel VBA一択です。

created by Rinker
技術評論社
¥3,608 (2022/12/08 14:44:42時点 Amazon調べ-詳細)

他の「VBA」の記事はこちらからどうぞ

VBA

Posted by やろまい