このサイトの記事内では「アフィリエイト広告」などの広告を掲載している場合があります。
消費者庁が問題としている「誇大な宣伝や表現」とならないよう配慮しコンテンツを制作しておりますのでご安心ください。
問題のある表現が見つかりましたらお問い合わせよりご一報いただけますと幸いです。

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

2024年7月17日

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

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

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

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

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

VBAが難しいと感じたら
ココナラにて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上級者を目指したい人にはパーフェクトExcel VBA一択です。
この本を読み切れば間違いなくVBA上級者になれます。

VBAが難しいと感じたら
ココナラにてVBAの作成依頼を受け付けています。
ご依頼・ご相談はこちらから

VBA

Posted by やろまい