こんにちは!Visioの図面整理に日々頭を悩ませていませんか?
「前任者が作った図面だから、フォントも色もバラバラ……」
「コーポレートカラーの規定が変わったのに、数百個ある図形の色を一つずつ手作業で変えるなんて無理!」
そんな絶望的な状況に出会ったとき、マクロの記録をポチるだけでは太刀打ちできません。しかし、Visioオブジェクトモデルの心臓部である「StyleSheet(スタイルシート)」をVBAから自在に操れるようになれば、どんなにカオスな図面も、一瞬で社内標準の美しいデザインに生まれ変わらせることができます。
今回は、Visio VBAの基礎固めをしながら、現場でそのまま使える「スタイル一括適用と競合解消のテクニック」を、優しく、そして深く伝授しましょう。ここをクリアすれば、あなたのVisio VBAスキルは間違いなく一段上のステージに到達しますよ!
—
1. Visio VBAの基本:オブジェクトの階層構造を知る
VisioのVBAを書く上で、最も重要なのは「今、どのオブジェクトを操作しているか」の階層(hierarchy)を意識することです。Visioの世界は、綺麗にロシアの民芸品「マトリョーシカ」のように入れ子構造になっています。
Application (Visioアプリ全体)
└ Documents (開いているファイル群)
└ Document (特定のファイル)
└ Pages (ページ群)
└ Page (特定のページ)
└ Shapes (図形群)
└ Shape (個別の図形)
今回のテーマである「スタイルの一括適用」では、この最下層にある `Shape` オブジェクト から、ドキュメント全体が持つマスター定義(スタイルシート)にアクセスし、上書きを仕掛けていくことになります。
—
2. なぜ「手作業」や「通常の塗りつぶし変更」ではダメなのか?
図形の「色」や「フォント」を変えたいとき、コードで `Shape.Cells(“FillForegnd”).Formula = “RGB(255,0,0)”` のように直接プロパティを叩くコードを書きがちです。
しかし、これでは「スタイルの鎖」が断ち切られてしまいます。
Visioの図形は、本来「スタイルシート(線のスタイル、塗りのスタイル、テキストのスタイルなど)」という親分に従属しています。直接プロパティを書き換えると、親分の支配を離れた「ローカル上書き(局所的な例外)」状態になり、後からドキュメント全体のテーマを変更したときに、その図形だけ取り残されてしまうのです。
私たちが目指すべきは、図形を直接いじるのではなく、「正しいスタイルシートをもう一度結びつける(StyleSheetプロパティの書き換え)」という、最もスマートで根本的なアプローチです。
—
3. 実践!社内標準スタイルを一括適用するVBAコード
それでは、アクティブページの全図形に対し、指定した社内標準スタイル(例: `”Shaded”` や独自のカスタムスタイル)を強制適用し、ついでに厄介な「スタイルの競合(ローカル上書き)」をきれいに解消する実用スクリプトを公開します。
開発タブの「Visual Basic」Editorを開き、標準モジュールにペーストして実行してみてください。
Sub ApplyCompanyStandardStyle()
‘ —————————————————-
‘ 匠のコメント:
‘ 選択図形(またはページ全体)のスタイル競合を強制解除し、
‘ 社内標準のスタイルシートを再適用するプロシージャ
‘ —————————————————-
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim targetStyleName As String
Dim processedCount As Long
‘ 1. 適用したい社内標準スタイル名を指定(例: Visio標準の “Heading” やカスタムスタイル)
targetStyleName = “Highlight” ‘ ※ドキュメント内に存在するスタイル名に書き換えてください
‘ アクティブなページを取得
Set vsoPage = ActivePage
processedCount = 0
‘ 画面描画をロックして処理速度を爆発的に向上させる(お作法です)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ 2. ページ内のすべての図形を走査
For Each vsoShape vsoPage.Shapes
‘ グループ図形の中身や、マスターシェイプ自体は除外するなどのガード条件
If vsoShape.Type <> visTypeGroup Then
‘ 【重要】スタイルの競合解消と適用
‘ Visioでは、LineStyle, FillStyle, TextStyle の3つが独立して存在します。
‘ それぞれに対して標準スタイルを再バインド(強制適用)します。
On Error Resume Next ‘ 存在しないスタイル名による実行時エラーを回避
‘ 線のスタイルを適用
vsoShape.LineStyle = targetStyleName
‘ 塗りのスタイルを適用
vsoShape.FillStyle = targetStyleName
‘ 文字のスタイルを適用
vsoShape.TextStyle = targetStyleName
On Error GoTo ErrorHandler ‘ エラー捕捉を通常に戻す
processedCount = processedCount + 1
End If
Next vsoShape
‘ 後処理
Application.ScreenUpdating = True
MsgBox “処理が完了しました。” & vbCrLf & “適用図形数: ” & processedCount & “個”, vbInformation, “スタイル標準化完了”
Exit Sub
ErrorHandler:
Application.ScreenUpdating = True
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End Sub
コードのここがポイント!
1. `Application.ScreenUpdating = False`:
大量の図形をループ処理する際、画面の再描画を挟むと動作が極端に遅くなります。これをオフにすることで、体感速度が数倍〜数十倍に跳ね上がります。プロのエンジニアの必須テクニックです。
2. 3つのスタイルプロパティ:
Visioの図形は「線(Line)」「塗り(Fill)」「文字(Text)」でそれぞれ異なるスタイルを持つことができます。完全な標準化を行うためには、上記のコードのように3つすべてをターゲットのスタイル名で上書きし、過去のローカル上書き(競合)をきれいにリセットしてあげる必要があります。
—
4. 陥りやすい罠とエラー対策
現場でこのコードを走らせたとき、初心者が必ずハマる罠が2つあります。
トラップ1: 「そんな名前のスタイルはありません」エラー(実行時エラー ‘-2034’ など)
指定した `targetStyleName`(例: `”Highlight”`)が、現在のVisioファイル(Document)内に定義されていない場合に発生します。
- 対策: あらかじめVisioの「開発」タブ > 「ドキュメント スタンシル」や、スタイル定義画面で、適用したいスタイル名が正確に存在するか確認してください。必要であれば、コード内で `ActiveDocument.Styles.Add` を使って動的にスタイルを作る処理を前置するのもスマートです。
トラップ2: グループ化された図形の中身が変わらない
上記のコードでは `vsoShape.Type <> visTypeGroup` でグループ自体を弾いている、あるいはグループ内の子図形(SubShape)まで再帰的に処理していません。
- 対策: 複雑な入れ子構造を持つ組織図やフロアマップを扱う場合は、再帰関数(自分自身を呼び出すプロシージャ)を組み込み、子図形(`vsoShape.Shapes`)の隅々までスタイルを浸透させるアーキテクチャにする必要があります。
—
まとめ:ここをクリアすれば、Visio VBAの基本はバッチリですよ!
今回は、Visio VBAのオブジェクトモデルの基礎を押さえつつ、`Shape.StyleSheet`(および関連するLineStyle/FillStyle/TextStyleプロパティ)を使った社内標準スタイルの強制適用と競合解消について解説しました。
手作業でのコピペ修正から卒業し、コード一発で図面全体のデザイン統制が取れるようになると、Visioを使ったドキュメント作成の自動化が圧倒的に楽しく、そして強力な武器になります。
ぜひ今回のコードをあなたの開発環境に持ち帰り、実際の業務効率化に役立ててください。
それでは、次回の高度な自動化の世界でお会いしましょう!お疲れ様でした!
