目次
はじめに
フローチャートやダイアグラムを作成している際、「このプロセスを表す四角形を、全部『角丸四角形』に変更したい」や「注意喚起で使っている星マークを、全部『爆発』マークに変えたい」といった、デザインの全面的な見直しが必要になることがあります。
図形の数が多ければ多いほど、手作業での変更は時間もかかり、変更漏れのリスクも伴います。しかしVBAを使えば、シート上にある特定の種類の図形だけを、瞬時に別の図形に一括で置換することが可能です。今回はその方法を解説します。
VBAで特定のシェイプを置換する基本ロジック
この処理の核となるロジックは、以下の3ステップで構成されます。
- シート上の全シェイプを一つずつ順番に調べる (ループ処理)
For Each...Next
という構文を使い、シートに存在する全てのシェイプを一つずつ取り出して処理対象にします。 - 取り出したシェイプが、目的の種類かどうかを判断する (条件分岐)
If
文を使い、シェイプの.AutoShapeType
プロパティを調べて、変更したい特定の図形(例:「星」)であるかどうかを判定します。 - 種類が一致したら、新しい図形の種類に変更する (代入) 条件に一致した場合のみ、そのシェイプの
.AutoShapeType
プロパティに、新しい図形の種類(例:「ハート」)を代入して形を変更します。
実践コード:シート上の「星」をすべて「ハート」に変更する
事前準備
このマクロを試すために、まずワークシート上に様々な種類の図形を配置してみてください。その中に、いくつか五角形の星(5 ポイント スター)を含めておくと、マクロの効果が分かりやすくなります。
VBAコード例
以下のコードは、アクティブなシート上にある全ての「五角形の星」を探し出し、「ハート」に変換するサンプルです。
Sub ChangeSpecificShapes()
' シート上のシェイプを一つずつ格納するための変数を宣言
Dim currentShape As Shape
' For Eachループで、アクティブなシート上の全シェイプを一つずつチェック
For Each currentShape In ActiveSheet.Shapes
' もしシェイプの種類が「五角形の星 (5 ポイント スター)」だったら...
If currentShape.AutoShapeType = msoShape5pointStar Then
' ...そのシェイプの種類を「ハート」に変更する
currentShape.AutoShapeType = msoShapeHeart
End If
Next currentShape ' 次のシェイプへ
' 処理が終わったことをメッセージで知らせる
MsgBox "シート上のすべての「星」を「ハート」に変更しました。"
End Sub
コードの解説
For Each currentShape In ActiveSheet.Shapes
シート上のすべてのシェイプの集合(ActiveSheet.Shapes
)から、シェイプを一つずつcurrentShape
という変数に取り出してループ処理を実行します。If currentShape.AutoShapeType = msoShape5pointStar Then
currentShape
の.AutoShapeType
プロパティを調べています。このプロパティには、その図形の種類を示す定数(mso...
で始まる名前)が格納されています。ここでは、それがmsoShape5pointStar
(五角形の星)と等しいかどうかを判定しています。currentShape.AutoShapeType = msoShapeHeart
条件に一致した場合、同じ.AutoShapeType
プロパティに、今度は変更したい図形の種類(msoShapeHeart
)を代入します。これにより、図形の形が変更されます。
ヒント:シェイプの種類の定数名を見つけるには?
msoShape5pointStar
やmsoShapeHeart
のような、図形の種類を表す定数名はどうやって調べればよいのでしょうか? これも「マクロの記録」機能を使えば簡単です。
- 「開発」タブから「マクロの記録」を開始します。
- 調べたい種類の図形をシートに挿入します(例:星)。
- 「マクロの記録」を終了します。
- VBE(Visual Basic Editor)で記録されたコードを確認します。
ActiveSheet.Shapes.AddShape(msoShape5pointStar, ...)
のように、AddShape
メソッドの第一引数として、その図形の定数名が記録されているはずです。
まとめ
今回は、VBAを使って特定の種類のシェイプを一括で置換する方法を解説しました。
For Each
ループでシート上の全シェイプを巡回する。.AutoShapeType
プロパティをIf
文で判定し、目的のシェイプを見つけ出す。- 条件に一致したシェイプの
.AutoShapeType
プロパティに、新しい種類の定数を代入して変更する。
この手法を応用すれば、複雑な図解資料のメンテナンスや、定型レポートのフォーマット更新などを劇的に効率化できます。ぜひマスターして、日々の業務に役立ててください。