【入門編】VBAからVisioのテーマとバリエーションを適用する:ApplyThemeで図面全体のデザインを一新する – Visio VBA解析バイブル

スポンサーリンク

こんにちは!いつも設計や業務効率化の業務、お疲れ様です。

「何十枚もあるVisioの構成図、手作業で1枚ずつ社内標準のデザインテーマに切り替えるのが面倒くさい…」
「マクロの記録をとってみたけれど、コードがごちゃごちゃしていて、どこを直せばきれいに動くのか分からない…」

そんな悩みを抱えていませんか?

Visioには、図面全体の見栄えをワンクリックで劇的に変える「テーマ」「バリエーション」という強力な機能が備わっています。これをVBAから自由自在にコントロールできるようになると、社内標準デザインへの一括準拠や、客先プレゼン用の一発デザイン切り替えが、文字通り「ボタンひとつ」で完了するようになります。

今回は、マクロの記録を卒業し、Visioのオブジェクトモデルの本質を理解しながら、スマートにテーマを適用する極意を伝授します。ここをクリアすれば、Visio VBAの基本はバッチリですよ。さあ、一緒に新しい扉を開きましょう!

1. Visioの「テーマ」の正体を知る

コードを書く前に、まずはVisioが「テーマ」をどう扱っているのか、その裏側の仕組みを少しだけ覗いてみましょう。ここを知っておくと、トラブルが起きたときの解決スピードが劇的に上がります。

Visio 2013以降、Office共通の強力なテーマエンジンが導入されました。Visioにおけるデザインは、主に以下の2つの要素で決定されます。

1. テーマ(Theme): 色、フォント、効果(シャドウやグラデーションなど)を定義した全体的なデザインの「方向性」です。(例: “Office”, “Modern”, “Simple” など)
2. バリエーション(Theme Variant): 同じテーマの中で、ベースとなる配色の組み合わせを変えた「バリエーション」です。(例: “Variant 1”, “Variant 2” など)

VBAでは、これらを`Document`オブジェクトまたは`Page`オブジェクトに対して適用します。
ドキュメント全体の統一感を保ちたいなら`Document`に、特定のページだけデザインを変えたいなら`Page`に対して命令を送るのが基本です。

2. 実践!テーマを一括適用する基本コード

まずは、現在開いているアクティブなドキュメント全体に、Microsoftの標準テーマである「Office」とそのバリエーションを適用する、美しくシンプルなVBAコードを見てみましょう。

初心者の方向けに、エラー処理やオブジェクトの安全な取り扱いを盛り込んだ実戦仕様のコードです。

Sub ApplyStandardThemeToAllPages()
Dim targetDoc As Visio.Document
Dim targetPage As Visio.Page

‘ 安全策:現在開いているアクティブなドキュメントを対象にする
Set targetDoc = Visio.ActiveDocument

‘ 万が一、ドキュメントが開いていない場合は処理を抜ける
If targetDoc Is Nothing Then
MsgBox “対象となるドキュメントが開かれていません。”, vbExclamation, “実行エラー”
Exit Sub
End If

On Error GoTo ErrorHandler

‘ 描画の更新とイベント解析を一時的に止めて、処理を高速化する(プロの隠し味です)
Visio.Application.ScreenUpdating = False
Visio.Application.DeferRecalc = True

Debug.Print “— テーマ適用処理を開始します —”

‘—————————————————————–
‘ 【本命】Documentオブジェクトに対してテーマを適用する
‘ ApplyTheme メソッドの引数:
‘ 1. テーマ名 (例: “Office”, “Trendy”, “Teal” など)
‘ 2. バリエーション名 (例: “Variant 1”, “Variant 2” など)
‘—————————————————————–
‘ ※ここではOffice標準の「Office」テーマ、バリエーション1を適用します
targetDoc.ApplyTheme “Office”, “Variant 1”

Debug.Print “ドキュメント全体へのテーマ適用が成功しました。”

CleanUp:
‘ 画面更新と自動計算を元に戻す(これを忘れるとVisioが固まったように見えます)
Visio.Application.ScreenUpdating = True
Visio.Application.DeferRecalc = False

‘ オブジェクトの解放
Set targetDoc = Nothing
Exit Sub

ErrorHandler:
MsgBox “テーマの適用中にエラーが発生しました:” & Err.Description, vbCritical, “エラー発生”
Resume CleanUp
End Sub

コードの解説

このコードで最も重要なのは `targetDoc.ApplyTheme “Office”, “Variant 1″` という1行です。

  • `ApplyTheme` メソッド:Visioに標準搭載されているテーマエンジンを呼び出す命令です。
  • 第1引数(テーマ名):”Office” や “Linear”, “Simple” といった、Visioの「デザイン」タブに並んでいるテーマの名前を文字列で指定します。
  • 第2引数(バリエーション名):それぞれのテーマの中にある「Variant 1」「Variant 2」などのバリエーションを文字列で指定します。

また、前後に挟んである `ScreenUpdating = False` と `DeferRecalc = True` は、大量の図形がある場合に画面がチカチカするのを防ぎ、処理速度を劇的に向上させるための「プロの常套手段」です。

3. 陥りやすい罠:「なぜかテーマが適用されない!」の解決策

コードはエラーなしで動いたのに、図形の色が全然変わらない…という現象に遭遇することがあります。これこそが、マクロの記録から脱却しようとするユーザーが最もぶつかりやすい「ローカル書式の罠」です。

罠の正体:個別設定(ローカル書式)の優先ルール

Visioの図形(Shape)は、個別に「赤色で塗りつぶす」「青い線を引く」といった直接的な書式設定がなされている場合、全体のテーマよりもその個別設定を優先するというルールを持っています。

手動で色を塗ってしまった図形は、上からテーマを適用しても「私はこの色で固定します!」と主張し続けてしまうのです。

解決策:個別書式をリセットしてテーマに追従させる

この罠を回避するには、図形に「テーマに従いなさい」という命令(リセット)を明示的に送る必要があります。以下のコードを既存の処理に組み込むことで、頑固な個別書式をリセットできます。

Sub ResetShapeToTheme(shp As Visio.Shape)
‘ 図形の塗りつぶしパターン、線のパターン、文字のパターンをテーマ追従に戻す
‘ 1610612736 (または &H60000000) は「テーマに従う」ことを示す特殊な定数です
On Error Resume Next
shp.CellsU(“FillPattern”).ResultIU = 1610612736
shp.CellsU(“LinePattern”).ResultIU = 1610612736
On Error GoTo 0
End Sub

このように、`CellsU` を使って数値をリセットすることで、どんな図形でも従順にテーマの色に染まってくれるようになります。

4. 実務で役立つ!組み込みテーマ名リスト

`ApplyTheme` に指定できる代表的なテーマ名とバリエーション名をまとめました。コードを書く際の参考にしてください。

| テーマ名 (ThemeName) | バリエーション名 (VariantName) | 特徴 |
| :— | :— | :— |
| `”Office”` | `”Variant 1″` 〜 `”Variant 4″` | 最も標準的でビジネスに最適なOfficeデザイン |
| `”Trendy”` | `”Variant 1″` 〜 `”Variant 4″` | 少しグラデーションが効いた、洗練されたモダンデザイン |
| `”Simple”` | `”Variant 1″` 〜 `”Variant 4″` | 枠線とシンプルな塗りつぶしのみのすっきりデザイン |
| `”Teal”` | `”Variant 1″` 〜 `”Variant 4″` | 青緑(ティール)を基調とした爽やかなテーマ |

> 💡 先輩のアドバイス:
> 正確なテーマ名がわからないときは、一度「マクロの記録」を開始した状態で、Visioの「デザイン」タブから好みのテーマを選択してみてください。生成されたコードの中に、正確なテーマ名とバリエーション名が記録されていますよ!

5. 応用:社内標準デザインへの一括変換ツールを作ろう

最後に、実務でそのまま使える「全ページのテーマを社内標準(Officeテーマのバリエーション3)にし、さらに個別書式をクリアする」という実戦的なマクロを紹介します。

Sub ConvertToCompanyStandard()
Dim doc As Visio.Document
Dim pg As Visio.Page
Dim shp As Visio.Shape

Set doc = Visio.ActiveDocument
If doc Is Nothing Then Exit Sub

‘ 画面更新を停止
Visio.Application.ScreenUpdating = False

‘ 1. まずドキュメント全体に「Office」テーマを適用
doc.ApplyTheme “Office”, “Variant 3”

‘ 2. 全ページをループし、個別に色が固定されている図形をテーマに強制追従させる
For Each pg In doc.Pages
For Each shp In pg.Shapes
‘ グループ図形などの内部も考慮し、再帰的に処理するのがベストですが、
‘ ここでは基本となる最上位の図形たちをリセットします
ResetShapeToTheme shp
Next shp
Next pg

‘ 画面更新を再開
Visio.Application.ScreenUpdating = True

MsgBox “ドキュメント全体を社内標準デザインに適合させました!”, vbInformation, “処理完了”
End Sub

Private Sub ResetShapeToTheme(shp As Visio.Shape)
On Error Resume Next
‘ 塗りつぶしと線をテーマ依存に強制変更
shp.CellsU(“FillPattern”).FormulaU = “THEMEVAL()”
shp.CellsU(“LinePattern”).FormulaU = “THEMEVAL()”
On Error GoTo 0
End Sub

このマクロを実行するだけで、過去に作成されたバラバラなデザインの古い図面たちも、一瞬で統一感のある美しい現代的なドキュメントへと生まれ変わります。

まとめ:これでVisioのデザイン制御はバッチリです!

今回は、Visio VBAを使ってドキュメント全体のテーマとバリエーションを操作する方法を解説しました。

  • `ApplyTheme` を使えば、1行でドキュメント全体や指定ページのデザインを変更できる
  • 反映されない図形があるときは、個別書式(ローカル書式)が邪魔をしている可能性を疑う
  • `CellsU(“FillPattern”).FormulaU = “THEMEVAL()”` などでテーマへの追従を強制できる

この基本さえマスターしてしまえば、手作業でのデザイン修正に追われる日々とはおさらばです。浮いた時間で、さらにクリエイティブな業務やシステム設計に集中してくださいね。

もし「こんなときどうすればいいの?」という疑問が湧いたら、いつでも頼ってください。あなたが作成するVisioマクロが、チームの業務を劇的に効率化することを応援しています!

タイトルとURLをコピーしました