Visioを「デザインツール」として飼い慣らす:Document.Colorsを掌握し、社内標準を強制する自動化戦略
Visioをただの作図ツールだと思っているなら、それは大きな誤解だ。本来、Visioは「データとグラフィックスを直結させるプラットフォーム」である。
多くのエンジニアが陥る罠がある。それは、図形一つひとつをマウスでポチポチ選択して色を変えるような、前時代的な工数だ。あるいは、VBAで色を直接RGB指定する愚行もよく見かける。だが、それでは「コーポレートカラーの変更」というたった一言の指示で、数千の図形を修正する羽目になる。
真の自動化エンジニアは、`Document.Colors`コレクションをハックする。今回は、Visioのドキュメントに社内標準カラーを強制的にインストールし、それを全図形に適用する「デザイン・ガバナンス」の極意を伝授する。
—
1. なぜ「直接指定」ではいけないのか
`Shape.Cells(“FillForegnd”).Formula = “RGB(0, 120, 215)”` のように直書きするのは避けるべきだ。理由は単純。保守性の欠如である。
もし将来、ブランドカラーが微妙に変わったら? 全モジュールを検索置換して回るのか?
そうではない。`Document.Colors`に登録し、インデックス(Color Index)で管理すべきだ。インデックスであれば、色定義を書き換えるだけで、ドキュメント全体の色が連鎖的に更新される。これがVisioのオブジェクトモデルを正しく理解した者の設計だ。
—
2. 堅牢なカラーパレット自動生成エンジン
以下のコードは、外部設定ファイル(今回は例としてJSONやCSVを想定した構造)から色情報を読み込み、ドキュメントのカラーパレットを拡張・適用するプロフェッショナル・コードだ。
実装のポイント
- 重複排除: 既存の色定義を上書き更新し、パレットの肥大化を防ぐ。
- エラーハンドリング: インデックス範囲外や不正なRGB値を排除する。
- 再描画抑制: `Application.ScreenUpdating`をオフにし、処理速度を極限まで高める。
Option Explicit
‘ 社内標準カラーをパレットに登録し、全図形に適用するメインプロシージャ
Public Sub DeployCorporateIdentity()
Dim doc As Visio.Document
Set doc = ActiveDocument
‘ 画面描画を停止してパフォーマンスを最大化
Application.ScreenUpdating = False
‘ 1. パレットへ色を登録(RGB値はデータベースや設定ファイルから取得する設計を推奨)
‘ ここでは例として「CorporateBlue」を登録
Call AddOrUpdateColor(doc, 100, 0, 120, 215)
‘ 2. 全ページ・全図形を走査して色を適用
Dim pg As Visio.Page
Dim shp As Visio.Shape
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ 塗りつぶし色をインデックス100番に設定
‘ FormulaUを使用することでグローバルな一貫性を保つ
shp.CellsU(“FillForegnd”).FormulaU = “THEMEGUARD(RGB(0,120,215))”
‘ ※インデックスで指定する場合は “THEMEGUARD(INDEXCOLOR(100))” と記述
Next shp
Next pg
Application.ScreenUpdating = True
MsgBox “CI適用完了。ドキュメントは標準化されました。”, vbInformation
End Sub
‘ カラーパレットへの登録を抽象化
Private Sub AddOrUpdateColor(doc As Visio.Document, index As Integer, r As Byte, g As Byte, b As Byte)
On Error Resume Next
‘ 既存パレットの更新
doc.Colors.Add RGB(r, g, b), index
If Err.Number <> 0 Then
‘ すでに存在する場合は再定義
doc.Colors(index).Color = RGB(r, g, b)
End If
On Error GoTo 0
End Sub
—
3. 実務で「事故らない」ための注意点
データベース連携の鉄則
社内カラーを外部DBで管理する場合、VBAから直接ADODBで接続するのは止めなさい。ネットワークの瞬断やDBのロックがVisioのハングアップを招く。
- 設計指針: 一度設定ファイルをローカルのJSONやXMLに落とし込み、それを読み込む構造にすること。これが「疎結合」な設計だ。
オブジェクトのライフサイクル
`Page.Shapes`をループする際、グループ化された図形(`Shape.Type = visTypeGroup`)には注意が必要だ。再帰処理(Recursive)を実装し、グループの奥深くに潜む図形まで確実に色を適用する設計にしなければ、デザインの不整合が必ず発生する。
なぜ「THEMEGUARD」を使うのか
コード内で `THEMEGUARD()` 関数を使用したことに気づいただろうか。これはVisioの強力な機能で、ユーザーが後から手動で色を変えようとしても、Visioのテーマエンジンが自動的に「元の標準色」に戻してくれるプロテクト機能だ。
これにより、「素人が勝手に色を変えてデザインを崩す」という悲劇を未然に防ぐことができる。
—
結論:エンジニアの誇りとして
Visio VBAを書くということは、単に図形を動かすコードを書くことではない。「組織のデザイン資産をコード化する」ということだ。
今回紹介したパレット管理の手法を取り入れれば、あなたのチームが作成するドキュメントは、誰が作っても一貫した品質を保つようになる。それが業務自動化エンジニアとしての、真の価値である。
さあ、退屈な手作業から卒業し、Visioをあなたの意のままに操るプラットフォームへと進化させよう。次の設計では、ぜひ「テーマ(Theme)」のカスタム定義にも挑戦してほしい。それについては、また別の機会に深く掘り下げることにしよう。
