こんにちは!Visio VBAの奥深い世界へようこそ。
マクロの記録ボタンを押して、生成されたコードを眺めてみたものの、「なんだか冗長だな」「思った通りに図形をコントロールできないな」と壁にぶつかっていませんか?
大丈夫、その壁を越える瞬間こそが一番プログラミングが楽しいところです。
今回は、Visio VBAの基礎のキモであるオブジェクトモデルをしっかりと捉えつつ、実務で絶対に役立つ「図面固有のカスタムカラーパレットをプログラムで一括定義する技術」を解説します。
ここをクリアすれば、あなたも単なる「操作の自動化」を超えて、「図面の品質そのものを統制するアーキテクト」の仲間入りです。さあ、一緒に扉を開けましょう!
—
1. Visioオブジェクトモデルのピラミッドを理解する
まず、Visio VBAを語る上で絶対に外せないのがオブジェクトモデルの階層構造(ピラミッド)です。Visioは、現実世界の書類棚のような構造をそのままコードの世界に持っています。
[Application] (Visioアプリそのもの)
│
└── [Document] (今開いているファイル/図面)
│
├── [Page] (図面の中のページ。複数あり得る)
│ │
│ └── [Shape] (ページ上に配置された図形たち)
│
└── [Colors] (★今回主役に据える図面固有のカラーパレット)
マクロの記録が吐き出すコードは、大抵この階層を省略して `ActiveWindow.Selection…` のようなその場しのぎの操作になりがちです。しかし、プロのエンジニアは常に「今、どの Document の、どの Page の、どの Shape を触っているのか」を明確に意識します。
この構造が頭に入っていれば、どんなに複雑な自動化要求が来ても迷子になることはありません。
—
2. なぜ `Document.Colors` を使って色を統一すべきなのか?
社内で「この資料はこのコーポレートカラーを使ってください」と指定されることはよくありますよね。Visioのデフォルトパレットにもたくさんの色がありますが、微妙なRGB値のズレや、プロジェクトごとの固有色(ブランドカラーなど)を毎回マウスでポチポチ設定するのは、エンジニアのすることではありません。
ここで登場するのが、`Document.Colors` コレクションです。
Visioの図面(`.vsd` / `.vsdx`)は、ファイル内部に「その図面専用のカラーパレット(全16〜24色など)」を持っています。このパレットの色をVBAから書き換えてあげることで、「この図面を開けば、指定したカスタムカラーがインデックス番号でいつでも呼び出せる状態」をプログラム一発で構築できるのです。
—
3. 実践!カスタムカラーを一括定義するVBAコード
それでは、実際に社内標準のカラーパレットを現在の図面に流し込む実用コードを見てみましょう。
開発タブの「Visual Basic」を開き、標準モジュールに以下のコードを貼り付けてください。
Sub ApplyStandardColorPalette()
‘ —————————————————-
‘ 目的: 現在アクティブな図面に社内標準のカスタムカラーパレットを一括登録する
‘ —————————————————-
Dim targetDoc As Visio.Document
Set targetDoc = ActiveDocument ‘ 今操作している図面を特定
On Error GoTo ErrorHandler
‘ Visioのカラーパレット(Colorsコレクション)は通常インデックス1から始まります
‘ ここでは例として、主要な3つのカスタムカラーをインデックスに割り当てます
‘ 【色1】コーポレート・ネイビー (RGB: 15, 45, 85) をインデックス番目に登録
‘ Index 1 を社内標準のメインカラーに設定
targetDoc.Colors(1) = RGB(15, 45, 85)
‘ 【色2】アクセント・オレンジ (RGB: 245, 130, 32) を設定
‘ Index 2 を強調色に設定
targetDoc.Colors(2) = RGB(245, 130, 32)
‘ 【色3】ベース・ライトグレー (RGB: 240, 242, 245) を設定
‘ Index 3 を背景やエリアの塗りに設定
targetDoc.Colors(3) = RGB(240, 242, 245)
‘ 画面を更新して変更を反映
targetDoc.ForceRecalc
MsgBox “社内標準カラーパレットの適用が完了しました!”, vbInformation, “成功”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
End Sub
コードの解説
1. `Set targetDoc = ActiveDocument`
曖昧な `Active…` への依存を断ち切り、まず操作対象の「Documentオブジェクト」を変数に確実に捉えています。これが堅牢なコードの第一歩です。
2. `targetDoc.Colors(index) = RGB(…)`
Documentが保持するパレットコレクションに直接RGB値を代入しています。これにより、この図面ファイルに色が焼き付けられます。
3. `targetDoc.ForceRecalc`
Visioは内部で描画の最適化を行っているため、コードでデータを書き換えた後に「再計算しなさい」と明示的に指示(`ForceRecalc`)してあげることで、画面上の表示漏れを防げます。
—
4. 現場で陥りやすい罠とエンジニアの知見
この `Document.Colors` を扱う上で、現場のエンジニアが必ずハマる「罠」が一つあります。
それは、「カラーインデックスの番号(1〜)と、図形のシェイプシート(ShapeSheet)で指定する番号のズレ」です。
Visioの図形の色(塗りつぶしや線)をVBAから変えるとき、次のようなプロパティ操作を行います。
‘ 例: 選択中の図形の塗りつぶし色を、カスタムパレットの「1番」に設定する
ActiveWindow.Selection(1).CellsU(“FillForegnd”).FormulaU = “RGB(15,45,85)”
‘ あるいはカラーindexを直接指定する場合
ActiveWindow.Selection(1).CellsU(“FillForegnd”).FormulaU = “IndexColor(1)”
ここで重要なのは、「RGB値をベタ書きするのではなく、`IndexColor(1)` やパレット参照の仕組みを意識すること」です。パレットの色自体を後から別の色(例えばネイビーを少し明るい青に)一括変更したい場合、`Document.Colors(1)` の定義を変えるだけで、そのパレットの色を参照しているすべての図形の色が一斉にアップデートされます。これこそが、ハードコーディングを避けるプロの設計手法です。
—
まとめ
今回は、Visio VBAの基礎であるオブジェクトモデルの階層を意識しながら、`Document.Colors` を使ったカスタムカラーパレットの一括定義について解説しました。
- Application → Document → Page → Shape のピラミッドを常に意識する。
- 図面ごとのカラー統制には `Document.Colors` コレクションを書き換えるアプローチが最強。
- マクロの記録から脱却し、オブジェクトを変数に格納して安全に操作する。
ここをクリアできれば、あなたの作るVisio自動化ツールは、単なる「手品の道具」から、チーム全体の生産性と品質を担保する「本格的な業務システム」へと生まれ変わります。
ぜひ、あなたの手元のVisioで試してみてくださいね。それでは、次回の極限の知見でお会いしましょう!
