条件を満たすすべての図形に同じ処理を行う方法を解説します。
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
詳しくはこちらの記事をご覧ください。