和風スパゲティのレシピ

日本語でコーディングするExcelVBA

条件を満たすすべての図形(Shape)に同じ処理

条件を満たすすべての図形に同じ処理を行う方法を解説します。

Shapesコレクションにあるすべての図形をFor Eachでループし、
Ifステートメントで処理条件を指定
します。

サンプルコード

マクロ全体の基本形

Sub 条件を満たすすべての図形に同じ処理を行う()
    
    Dim ws対象シート As Worksheet
    Set ws対象シート = ThisWorkbook.Worksheets("○○")
    
    ' 対象シート上のすべてのShapeをループ
    Dim シェイプ As Shape
    For Each シェイプ In ws対象シート.Shapes
    
        ' 処理する図形の条件(例:名前がTextBoxから始まる)
        If シェイプ.Name Like "TextBox*" Then
            
            ' 各図形への処理(例:シェイプを削除)
            Debug.Print シェイプ.Name
            
        End If
    
    Next
    
End Sub

条件式サンプル

▼ 名称で判定

If シェイプ.Name = "条件文字列" Then ' 完全一致
If シェイプ.Name Like "条件文字列*" Then ' 前方一致
If シェイプ.Name Like "*条件文字列*" Then ' 部分一致
If シェイプ.Name Like "*条件文字列" Then ' 後方一致

 
▼ 図形の種類で判定

If シェイプ.Type = msoTextBox Then ' テキストボックス
If シェイプ.Type = msoAutoShape Then ' オートシェイプ
If シェイプ.Type = msoPicture Then ' 画像
If シェイプ.Type = msoGroup Then ' グループ
If シェイプ.Type = msoChart Then ' グラフ
If シェイプ.Type = msoLine Then ' 線
If シェイプ.Type = msoFormControl Then ' フォームコントロール

 
▼ オートシェイプの種類で判定

If シェイプ.Type = msoAutoShape Then
    
    If シェイプ.AutoShapeType = msoShapeRectangle Then ' 四角形
    If シェイプ.AutoShapeType = msoShapeRoundedRectangle Then ' 角丸四角形
    If シェイプ.AutoShapeType = msoShapeOval Then ' 楕円
    If シェイプ.AutoShapeType = msoShapeRightArrow Then ' 右矢印

 
▼ 図形内の文字列で判定

If シェイプ.HasTextFrame = msoTrue Then
    If シェイプ.TextFrame2.HasText = msoTrue Then
        
        If シェイプ.TextFrame2.TextRange.Text = "条件文字列" Then ' 完全一致
        If シェイプ.TextFrame2.TextRange.Text Like "条件文字列*" Then ' 前方一致
        If シェイプ.TextFrame2.TextRange.Text Like "*条件文字列*" Then ' 部分一致
        If シェイプ.TextFrame2.TextRange.Text Like "*条件文字列" Then ' 後方一致

 
▼ 図形内テキストを持つかを判定

If シェイプ.HasTextFrame = msoTrue Then
    If シェイプ.TextFrame2.HasText = msoTrue Then

 
▼ 図形内の文字列で判定

If シェイプ.HasTextFrame = msoTrue Then
    If シェイプ.TextFrame2.HasText = msoTrue Then
        
        If シェイプ.TextFrame2.TextRange.Text = "条件文字列" Then ' 完全一致
        If シェイプ.TextFrame2.TextRange.Text Like "条件文字列*" Then ' 前方一致
        If シェイプ.TextFrame2.TextRange.Text Like "*条件文字列*" Then ' 部分一致
        If シェイプ.TextFrame2.TextRange.Text Like "*条件文字列" Then ' 後方一致
        

 
▼ サイズで判定

If シェイプ.Width >= 100 Then ' 幅が100ポイント以上
If シェイプ.Height >= 100 Then ' 高さが100ポイント以上

 
▼ 座標で判定

If シェイプ.Top >= 100 Then ' シート上部から100ポイント以上左
If シェイプ.Left >= 100 Then ' シート左部から100ポイント以上右

 
▼ セル基準の位置で判定

If シェイプ.Top >= ws対象シート.Rows(10).Top Then ' 10行目より下
If シェイプ.Left >= ws対象シート.Columns(10).Left Then ' 10列目より右

 
▼ 図形が設置されたセルのアドレスで判定

Shape.TopLeftCell/BottomRightCell で判定します。
詳しくはこちらの記事をご覧ください。

解説

Worksheet上にあるすべての図形(シェイプ)を取得するには、
ShapesコレクションをFor Eachステートメントでループします。


条件を満たす図形だけループすることはできませんので、
全図形をループし、そのループの中で条件を指定してください。


なお、今回のコードはシート上のすべての図形を処理していますが、
ブック内のすべての図形を処理したいこともあると思います。

その場合、WorkbookオブジェクトはShapesプロパティを持っていませんので、
一旦すべてのシートをループし、さらにその中でShapesをループします。

' ↓ このように二重ループを書く
For Each シート In Workbooks("○○.xlsx").Worksheets
    For Each シェイプ In ws対象シート.Shapes

' ↓ NG。こう書くことはできない
For Each シェイプ In Workbooks("○○.xlsx").Shapes

 
詳しくはこちらの記事をご覧ください。