Visio VBAの「真の力」を引き出す:DocumentSheetに宿るグローバル状態管理の極意
こんにちは。自動化の現場でVisioと格闘し続けてきた諸君、ようこそ。
マクロの記録ボタンを押して生成されたコードを眺める段階は、もう卒業しよう。Visio VBAをマスターするということは、単に図形を動かすことではない。「Visioという巨大なオブジェクトモデルの海を、いかにエレガントに航海するか」という設計思想そのものなんだ。
今日は、多くの初心者が陥る「グローバル変数地獄」から脱却し、Visioというアプリの特性を最大限に活かした「ファイル完結型の状態管理法」を伝授する。
—
なぜ「グローバル変数」は悪なのか?
VBAを書いていると、つい `Public g_Config As String` のようなグローバル変数を乱用したくなる。だが、それは危険な道だ。
- メモリの不安定さ: VBAプロジェクトがリセットされると、変数の値はすべて消滅する。
- 移植性の欠如: ファイルを別のPCに渡した際、設定が引き継がれない。
そこで登場するのが、`Document.DocumentSheet` という「隠しコマンド」だ。
—
DocumentSheetとは何か?
Visioのドキュメントには、目に見えるページ以外に、裏側でドキュメント全体を制御する「DocumentSheet」という特別なマスターシェイプが存在する。ここには「ShapeSheet」という強力なスプレッドシートが備わっており、そこに値を書き込めば、ファイルと一緒にデータが保存されるという魔法が使えるんだ。
1. DocumentSheetのUserセクションを活用する
ShapeSheetの「User-defined Cells(ユーザー定義セル)」は、まさにプログラムの「設定ファイル」として機能する。
2. 実装コード:状態を書き込み、読み出す
以下のコードを見てほしい。これはドキュメントに「最後に処理した実行ログ」を刻み込むための関数だ。
‘ ドキュメントのDocumentSheetに状態(値を)保存する関数
Public Sub SaveStateToDocument(keyName As String, value As String)
Dim docSheet As Visio.Shape
‘ DocumentSheetを取得する(これがドキュメントの「脳」だ)
Set docSheet = ActiveDocument.DocumentSheet
‘ 指定したキー名がUserセクションにない場合は作成する
If Not docSheet.CellExists(“User.” & keyName, False) Then
docSheet.AddRow visSectionUser, visRowLast, visTagDefault
docSheet.Section(visSectionUser).Row(docSheet.RowCount(visSectionUser) – 1).Name = keyName
End If
‘ 値を書き込む
docSheet.Cells(“User.” & keyName).Formula = “””” & value & “”””
End Sub
‘ ドキュメントから状態を読み出す関数
Public Function GetStateFromDocument(keyName As String) As String
Dim docSheet As Visio.Shape
Set docSheet = ActiveDocument.DocumentSheet
‘ セルが存在するか確認してから取得
If docSheet.CellExists(“User.” & keyName, True) Then
GetStateFromDocument = docSheet.Cells(“User.” & keyName).ResultStr(“”)
Else
GetStateFromDocument = “” ‘ 未設定なら空文字を返す
End If
End Function
—
このテクニックの何が凄いのか?
1. 永続性: ファイルを保存して閉じても、次に開いたときには値が残っている。DBや外部テキストファイルは不要だ。
2. 可視化: Visioの「開発」タブから「シェイプシートを表示」を選べば、いつでも手動で設定値を確認・修正できる。これはデバッグ時に絶大な威力を発揮する。
3. 純潔性: 変数をコード内に保持しないため、VBAのプロジェクトがリセットされても、状態を見失うことがない。
—
注意点:陥りやすい罠
ここからは先輩からのアドバイスだ。初心者がよくやるミスを防ごう。
- 文字列のクォート: ShapeSheetに書き込む際は、値の前後に `”` を追加する必要がある。`Formula` プロパティは数式として評価されるからだ。コード内の `”””” & value & “”””` という記述は、セルに文字列として認識させるための魔法の呪文だと思ってくれ。
- 名前の制約: `User.` の後に続く名前には、スペースや特殊文字を使わないこと。英数字だけで構成するのがプロの作法だ。
—
さあ、次のステージへ
どうだろう。`DocumentSheet` を使いこなすことで、君が書くマクロは「ただ動くもの」から「運用に耐えうるシステム」へと進化する。
この基礎をクリアすれば、次は「PageSheet」を使ったページごとの状態管理や、イベントハンドラを組み合わせた自動追従処理の世界が待っている。
Visioの深淵はまだ入り口に過ぎない。困ったことがあれば、いつでも質問してくれ。君の自動化ライフが、より快適で知的になりますように。応援しているよ!
