こんにちは! Visio VBAの世界へようこそ。
マクロの記録ボタンを押してコードを生成する段階は、もう卒業しましたね。ここからは、Visioの心臓部である「オブジェクトモデル」を自在に操り、プロフェッショナルなツールを作り上げる領域です。
今回は、現場で「おっ、やるな!」と一目置かれること間違いなしの、『Documentのソリューションセクション(SolutionXRef)活用術』を伝授します。
ユーザーの目に見えない場所で、マクロの実行履歴やライセンス情報をこっそり、かつ安全に管理する――。この裏ワザをマスターすれば、あなたの作るVisioツールは一気に「商用アプリケーション」の風格を帯びます。さあ、一緒に扉を開けましょう!
—
1. なぜ「ソリューションセクション」なのか?
Visioでツールを作っていると、こんな壁にぶつかりませんか?
- 「この図面、前回いつどのマクロで更新されたっけ?」
- 「無料トライアル版の有効期限を、ユーザーに勝手に書き換えられないように持たせたい」
- 「設定データを保存したいけれど、シェイプデータ(旧カスタムプロパティ)として画面に出したくない」
通常、データを保存しようとすると「ドキュメントプロパティ」や「シェイプデータ」を使いがちです。しかし、これらはユーザーがUI上から簡単に閲覧・編集できてしまいます。つまり、データの改ざんや、不要な削除のリスクが常につきまとうのです。
ここで登場するのが、Visioのドキュメント(`Document`オブジェクト)が密かに持っている「ソリューションセクション(SolutionXRef)」です。
💡 ソリューションセクションとは?
Visioの裏側(ShapeSheetの奥底)に存在する、開発者専用の「秘密のメモ帳」のようなものです。
ユーザーの目には絶対に触れません。UIのどこを探しても表示されず、VBAからのみ読み書きができる――まさに、メタデータや内部状態を隠し持つための特等席なのです。
—
2. Visioオブジェクトモデルの基本と今回のターゲット
Visio VBAの階層構造は、ロシアの民芸品「マトリョーシカ」のように美しく組み重なっています。
Application (Visioアプリ全体)
└─ Documents (開いている図面のコレクション)
└─ Document (対象の図面ファイル) 🌟 今回の主役!
├─ Pages (ページたち)
└─ 秘密のソリューションセクション (SolutionXRef)
`Document` オブジェクトの奥深くにある `Solution` 関連のメソッドを使うことで、図面ファイルそのものにデータを「憑依(ひょうい)」させることができます。ファイルを持ち運べば、内部のデータも一緒に移動するため、外部データベースや設定ファイルが不要という大きなメリットがあります。
—
3. 実践!不可視データを書き込む・読み出すVBAコード
それでは、実際にコードを書いてみましょう。
以下のコードをVBAエディタ(Alt + F11)の標準モジュールに貼り付けて実行してみてください。
このコードでは、「ツールが最後に実行された日時」と「ライセンス認証フラグ」をDocumentのソリューション領域に安全に保存・取得します。
Option Explicit
‘ ====================================================================
‘ 1. ソリューション領域にメタデータを書き込むプロシージャ
‘ ====================================================================
Sub SaveInternalMetadata()
Dim doc As Visio.Document
Set doc = ActiveDocument ‘ 現在アクティブなドキュメントを対象にする
Dim targetName As String
Dim dataValue As String
‘ 管理したいキーと値(今回は実行履歴とライセンス情報)
targetName = “MyToolInfo”
dataValue = “LastRun:” & Format(Now, “yyyy-mm-dd hh:nn:ss”) & “|License:Activated-9999”
On Error GoTo ErrorHandler
‘ SolutionXRef (Solution) を使ったデータの保存
‘ 第1引数: 識別名(ユニークな名前), 第2引数: 保持させたい文字列データ
doc.SetSolutionField targetName, dataValue
MsgBox “内部データの保存に成功しました!” & vbCrLf & _
“(シェイプデータやプロパティ画面には何も表示されません)”, _
vbInformation, “ソリューションセクション活用術”
Exit Sub
ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
End Sub
‘ ====================================================================
‘ 2. ソリューション領域からデータを読み出すプロシージャ
‘ ====================================================================
Sub ReadInternalMetadata()
Dim doc As Visio.Document
Set doc = ActiveDocument
Dim targetName As String
Dim retrievedValue As String
targetName = “MyToolInfo”
On Error GoTo ErrorHandler
‘ 保存時と同じ識別名を指定してデータを取得
retrievedValue = doc.GetSolutionField(targetName)
If retrievedValue = “” Then
MsgBox “指定された内部データはまだ存在しません。”, vbExclamation
Else
MsgBox “【取得した内部メタデータ】” & vbCrLf & retrievedValue, _
vbInformation, “読み出し成功”
End If
Exit Sub
ErrorHandler:
‘ データが存在しない場合などのエラーをハンドリング
MsgBox “データが見つからないか、まだ書き込まれていません。”, vbExclamation
End Sub
ほら、簡単でしょう?
コードの実行後、Visioの画面をいくら見回しても、入力した文字列(`LastRun:…`)が表示される場所はありません。しかし、`ReadInternalMetadata`を実行すると、確かにデータが保持されていることが確認できます。これが、プロの隠蔽術です。
—
4. 陥りやすいエラーと知っておくべき注意点
エンジニアとして、この強力な機能を現場で使う際に絶対に知っておくべき注意点をいくつか共有しておきます。
⚠️ 注意点1: 図面が「保存(Save)」されていないと消える
`SetSolutionField` でメモリ上に書き込んだデータは、ドキュメントが一度も保存されていない状態(新規作成直後など)では、ファイルに定着しません。必ず `ActiveDocument.Save` を行うか、ユーザーに保存を促すフローを組み込んでください。
⚠️ 注意点2: 識別名のコンフリクト(衝突)に気をつける
他のアドオンや、将来別の機能を追加したときに、同じ識別名(例: `”MyToolInfo”`)を使ってしまうとデータを上書きしてしまいます。
識別名には、`”com.yourcompany.toolname.metadata”` のように、Javaのパッケージ名のようなユニークな命名規則(プレフィックス)を採用することをおすすめします。
—
まとめ:ここをクリアすれば、Visio VBAの基本はバッチリです!
今回は、`Document` オブジェクトの奥底に眠る「ソリューションセクション(SolutionXRef)」を使った、不可視データの管理方法を解説しました。
- ユーザーに見せたくないメタデータは、シェイプデータやカスタムプロパティではなく、ソリューション領域へ隠す。
- `SetSolutionField` と `GetSolutionField` を使えば、コード数行で安全なデータの読み書きができる。
ここをマスターしたあなたは、単なる「マクロの自動記録ユーザー」から、実用的な業務システムを設計できる「Visioソリューション・エンジニア」への階段を確実に登っています。
日々の開発業務で、ぜひこのテクニックを役立ててくださいね。あなたのVBAライフが、さらに知的でワクワクするものになりますように!
