こんにちは! Visioでの図面作成、いつもお疲れ様です。
「あっちの四角は文字サイズが10ptなのに、こっちは12ptになっている……」「担当者が変わるたびに図面全体のデザインがバラバラになる……」
図面の見た目を整えるために、一つひとつの図形をマウスで選んで、フォントや色をポチポチ変更していませんか?もしそうなら、今日でその泥臭い作業とはお別れしましょう。
今回は、Visio VBAを使って「テーマ機能に頼らず、コードの力で図面の見た目を完全に標準化する技術」を伝授します。ここをクリアすれば、あなたもマクロの記録から一歩抜け出し、Visio VBAの構造を操るエンジニアの仲間入りです。さあ、一緒に扉を開けましょう!
—
なぜ「テーマ」ではなく「Styleオブジェクト」なのか?
Visioには標準で「テーマ」や「バリエーション」という便利な機能が備わっています。しかし、大規模な業務フロー図やネットワーク図を描く現場において、デフォルトのテーマ機能には次のようなジレンマがあります。
- 意図しない自動変更: Visioのバージョンや図形の種類によって、テーマの適用結果が微妙に変わり、統制が取りづらい。
- 微調整の限界: 自社ブランドの指定色(コーポレートカラーなど)を厳密に適用したい場合、標準テーマではかゆい所に手が届かない。
そこで登場するのが、Visioの隠れた名機能「Styleオブジェクト(Style)」です。
CSS(Cascading Style Sheets)をイメージしてください。WebサイトのデザインをCSSで一元管理するように、Visioの「スタイル」があらゆる図形のルックス(線、塗り、文字)を裏で支配します。私たちはVBAを使って、このスタイルを自由自在に定義し、一瞬で図形たちに纏わせるのです。
—
Visioオブジェクトモデルの基本階層を理解する
コードを書く前に、Visioの世界がどうなっているのか、地図を確認しておきましょう。Visio VBAのオブジェクトは、きれいな階層構造(ツリー構造)をしています。
Application (Visioアプリ自体)
└─ Documents (開いている図面たち)
└─ Document (いま作業している図面)
├─ Styles (今回主役となるスタイルのコレクション)
└─ Pages (ページたち)
└─ Page (現在のページ)
└─ Shapes (図形たち)
└─ Shape (個々の図形 = Styleプロパティを持つ)
今回のミッションは、このツリーの頂点に近い `Document.Styles` に「独自のカスタムスタイル」を登録し、ページ内のすべての `Shape.Style` プロパティ書き換えて一網打尽にすることです。
—
実践:カスタムスタイルを作成し、全図形へ一括適用するVBAコード
百聞は一見に如かず。開発の現場でそのままコピペして使える、実用的なプロシージャを用意しました。
このコードは、以下の3ステップを自動で行います。
1. 図面内に「MyCorporateStyle」という名前のカスタムスタイルがなければ作成する。
2. そのスタイルの「塗りつぶし・線・フォント」をプログラムでガッチリ定義する。
3. アクティブページにあるすべての図形(Shape)に対し、一瞬でそのスタイルを適用する。
Sub ApplyStandardStyleToAllShapes()
‘ 変数の宣言
Dim vsoDoc As Visio.Document
Dim vsoStyle As Visio.Style
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Const STYLE_NAME As String = “MyCorporateStyle”
‘ 1. 現在アクティブなドキュメントとページを取得
Set vsoDoc = ActiveDocument
Set vsoPage = ActivePage
‘ 2. カスタムスタイルの存在チェックと作成
On Error Resume Next
Set vsoStyle = vsoDoc.Styles(STYLE_NAME)
On Error GoTo 0
If vsoStyle Is Nothing Then
‘ スタイルが存在しない場合は新規作成
‘ 引数: (スタイル名, 継承元スタイル名, 塗りを含めるか, 線を含めるか, テキストを含めるか)
Set vsoStyle = vsoDoc.AddStyle(STYLE_NAME, “Normal”, True, True, True)
End If
‘ 3. スタイルの詳細プロパティを設定(ここで見た目をコード化する)
With vsoStyle
‘ 塗りつぶしの設定(例:淡いブルー RGB(240, 248, 255))
.CellsSRC(visSectionObject, visRowFill, visFillForegnd).FormulaU = “RGB(240,248,255)”
‘ 線の設定(例:濃いブルー RGB(70, 130, 180)、太さ 1pt)
.CellsSRC(visSectionObject, visRowLine, visLineColor).FormulaU = “RGB(70,130,180)”
.CellsSRC(visSectionObject, visRowLine, visLineWidth).FormulaU = “1 pt”
‘ 文字書式の設定(例:フォントサイズ 10pt、フォント名 “Meiryo”)
.CellsSRC(visSectionCharacter, 0, visCharacterSize).FormulaU = “10 pt”
.CellsSRC(visSectionCharacter, 0, visCharacterFont).FormulaU = “””Meiryo”””
End With
‘ 4. アクティブページの全図形にスタイルを一括適用
If vsoPage.Shapes.Count = 0 Then
MsgBox “対象となる図形がページ上に存在しません。”, vbExclamation, “処理終了”
Exit Sub
End If
For Each vsoShape in vsoPage.Shapes
‘ グループ図形の子要素や、コネクタなどを除外したい場合はここで条件分岐を追加できます
‘ 今回はシンプルにすべての図形にスタイル名を代入します
vsoShape.Style = STYLE_NAME
Next vsoShape
‘ 5. 完了メッセージ
MsgBox “スタイルの作成と全図形への適用が完了しました!”, vbInformation, “成功”
End Sub
—
コードの重要ポイントと、初心者がハマりがちな罠
上記のコードには、Visio VBAを扱う上で絶対に知っておくべき「プロの知見」が詰まっています。いくつか重要なポイントを解説します。
① `.FormulaU` とプロパティ指定の罠
Visio VBAでは、図形のプロパティに値を代入する際、`Value` ではなく `.FormulaU` を使うのが基本であり鉄則です。
Visioの裏側では、すべての数値や色が「数式(Formula)」として管理されています。そのため、文字列として `”10 pt”` や `”RGB(240,248,255)”` をFormulaUプロパティに渡すことで、内部のシェイプシート(ShapeSheet)が直接書き換わる仕組みになっています。
② フォント名のダブルクォーテーションに注意
コード内の `.CellsSRC(visSectionCharacter, 0, visCharacterFont).FormulaU = “””Meiryo”””` という記述に注目してください。
`”Meiryo”` のままだとVBAの文字列リテラルと競合してしまうため、VBA内でダブルクォーテーションを文字として含めるために `””` と二重(エスケープ)にしています。ここを忘れると構文エラーになるので要注意です。
③ エラーハンドリングの重要性
`vsoDoc.Styles(STYLE_NAME)` で既存のスタイルを探す際、その名前のスタイルが存在しないとVisioはエラー(実行時エラー)を吐いて止まってしまいます。
そのため、一時的に `On Error Resume Next` を使ってエラーを無視させ、`vsoStyle Is Nothing`(見つからなかったかどうか)で判定して新規作成するという、堅牢な(ロバストな)エラーハンドリングを組むのが実務の定石です。
—
ここをクリアすれば、Visio VBAの基本はバッチリです!
いかがでしょうか?
「マクロの記録」ボタンを押して得られるコードは、ただの「操作の再現」にすぎません。しかし、今回のように `Document.Styles` を操作し、ループ文で図形群の `Style` プロパティをごっそり書き換えるコードが書けたなら、あなたはもう「Visioをプログラムで支配する側」のエンジニアです。
このロジックを応用すれば、
- ファイルを開いた瞬間に、社内標準のスタイルを自動で流し込むアドイン
- 複数ページにわたる巨大な図面のスタイルを一括でリフレッシュするメンテナンスツール
なども簡単に作れるようになります。
日々の退屈な図面整形作業をコードで自動化し、もっとクリエイティブな設計業務に時間を使いましょう。あなたのVBAライフがここからさらに加速することを応援しています!
