こんにちは。あなたのメンターを務めるチーフアーキテクトです。
Visioを単なる「作図ツール」だと思っていませんか? もしそうなら、あなたはフェラーリを持っていて、近所のコンビニに買い物に行くためだけにしか使っていないようなものです。
Visioの本質は、「図形(Shape)という名のUIコンポーネントに、ShapeSheetという名のロジックを組み込み、VBAというエンジンで駆動させる」という、極めて高度なアプリケーション開発プラットフォームであることです。
今日は、多くのユーザーが躓く「ステンシル(マスターシェイプ)」の壁を突破し、「配置するだけで機能が動き出す」動的なマスターシェイプの作り方を伝授します。ここをマスターすれば、あなたは「図を描く人」から「ツールを作るエンジニア」へと進化できるはずです。
準備はいいですか? それでは、Visio VBAの深淵へ踏み込みましょう。
1. 【概念】マスターシェイプは「クラス」、配置した図形は「インスタンス」
まず、プログラミング的な視点でVisioを捉え直しましょう。
- マスターシェイプ(Stencil内の図形) $\approx$ クラス(Class)
- 「どういう見た目で、どういう振る舞いをするか」という定義書。
- 配置された図形(Page上の図形) $\approx$ インスタンス(Instance)
- 定義書に基づいて実体化したもの。
通常、ダブルクリックで何かをさせたい場合、配置した後の図形一つひとつに設定を書き込みますが、それでは効率が悪すぎます。「マスターシェイプ側」に「ダブルクリックされたらこの関数を呼べ」という命令を書き込んでおくことで、そのマスターから配置される全ての図形が、最初からその能力を持って生まれてくることになります。
この「命令」を書き込む場所こそが、Visioの心臓部である「ShapeSheet(シェイプシート)」です。
2. 【核心】ShapeSheetの `EventDblClick` セルを掌握せよ
Visioのあらゆる図形は、裏側でExcelのようなスプレッドシート(ShapeSheet)を持っています。
その中の `Events` セクションにある `EventDblClick` というセルに、VBAの関数名を文字列として書き込むことで、ダブルクリックイベントをトリガーさせることができます。
ここがポイント:
手動でShapeSheetを開いて書き込むこともできますが、エンジニアならVBAを使って動的にこのセルを書き換えましょう。 これにより、大量のマスターシェイプに対して一括で動作を割り当てることが可能になります。
3. 【実践】動的に動作を割り当てる実装コード
それでは、実際に「ステンシル内のマスターシェイプに、ダブルクリックイベントを割り当てる」コードを書いていきましょう。
実装シナリオ
1. 「MyTools」という名前のステンシルから、「CustomButton」というマスターを探す。
2. そのマスターの `EventDblClick` セルに、`MyCustomAction` という関数名を書き込む。
3. 以後、そのマスターをページにドラッグ&ドロップすると、ダブルクリックで `MyCustomAction` が実行される。
' ======================================================================================
' 目的: マスターシェイプにイベントハンドラを動的に割り当てる
' --------------------------------------------------------------------------------------
' このコードは、標準モジュールに記述してください。
' ======================================================================================
Option Explicit
''' <summary>
''' マスターシェイプにダブルクリック時の動作を定義するメインルーチン
''' </summary>
Public Sub SetupMasterShapeBehavior()
Dim vsoStencil As Visio.Stencil
Dim vsoMaster As Visio.Master
Dim targetStencilName As String
Dim targetMasterName As String
Dim macroName As String
' --- 設定領域 ---
targetStencilName = "MyTools" ' ステンシル名(ファイル名)
targetMasterName = "CustomButton" ' マスターシェイプ名
macroName = "MyCustomAction" ' 呼び出したいVBA関数名
' ----------------
On Error GoTo ErrorHandler
' 1. ステンシルを特定する
' すでに開いているステンシルから探します
Set vsoStencil = Visio.Documents.Stencils(targetStencilName)
' 2. マスターシェイプを特定する
Set vsoMaster = vsoStencil.Masters(targetMasterName)
' 3. ShapeSheetの EventDblClick セルにマクロ名を書き込む
' CellsU はユニバーサル名でセルを指定できる非常に強力なメソッドです。
' ここでマクロ名をダブルクォーテーションで囲って文字列として格納するのがコツです。
vsoMaster.CellsU("EventDblClick").FormulaU = """" & macroName & """"
MsgBox "マスターシェイプ '" & targetMasterName & "' に動作を割り当てました。" & vbCrLf & _
"これで配置するだけで機能します!", vbInformation
Exit Sub
ErrorHandler:
MsgBox "エラーが発生しました: " & Err.Description, vbCritical
End Sub
''' <summary>
''' 図形がダブルクリックされた時に実際に実行される関数
''' </summary>
''' <param name>shp</param> トリガーとなった図形オブジェクト
Public Sub MyCustomAction(shp As Visio.Shape)
' shp 引数には、ダブルクリックされた図形自身が渡ってきます。
' これを利用して、図形のテキストを変えたり、プロパティを操作したりします。
MsgBox "エンジニアの魂が宿った図形です!" & vbCrLf & _
"図形名: " & shp.Name & vbCrLf & _
"現在のテキスト: " & shp.Text, vbInformation
' 例: 図形の色をランダムに変えてみる
shp.CellsU("FillForegnd").FormulaU = "RGB(" & Int(Rnd * 255) & "," & Int(Rnd * 255) & "," & Int(Rnd * 255) & ")"
End Sub
4. 【深掘り】ここがエンジニアの分かれ道:注意点とTips
コードをコピーして動かすだけでは、まだ「初級」です。現場で直面する「罠」を回避するための知見を共有します。
① マクロ名の「二重クォーテーション」問題
`vsoMaster.CellsU(“EventDblClick”).FormulaU = “””” & macroName & “”””`
この部分で、なぜ `”` を大量に書いているのか不思議に思ったかもしれません。
ShapeSheetのセルに文字列を書き込む際、Visioはそれを「数式(Formula)」として解釈します。したがって、「文字列としてのマクロ名」を渡すには、数式の中でさらにダブルクォーテーションで囲まれている必要があるためです。ここを間違えると、「マクロが見つかりません」というエラーに悩まされることになります。
② パフォーマンスとライフサイクル
マスターシェイプを書き換えると、それ以降に配置される図形にのみ適用されます。既にページに配置済みの図形には反映されません。
もし既存の図形すべてに適用したい場合は、ページ上の全シェイプをループで回して `CellsU(“EventDblClick”)` を書き換える処理を追加してください。
③ 関数のシグネチャ(引数)を厳守せよ
`MyCustomAction(shp As Visio.Shape)` のように、必ず `Visio.Shape` 型の引数を持つ関数として定義してください。Visio側からイベントが飛んでくるとき、どの図形が操作されたかを伝えるためにこの引数が必須となります。
5. まとめ:Visio VBAの地平線へ
今回学んだことは、単なるイベント割り当てではありません。「データ(マスター)」と「振る舞い(VBA)」を切り離し、動的に結合させるという、設計思想の転換です。
1. マスターシェイプを定義する
2. VBAでShapeSheetのイベントセルを書き換える
3. 配置されたインスタンスが、定義済みの関数を呼び出す
このフローを理解すれば、例えば「設備図面でポンプをダブルクリックしたら、その設備のスペックシート(外部Excel)を自動で開く」といった、業務用ツールとしてのVisio活用が可能になります。
ここをクリアすれば、Visio VBAの基本はバッチリです。
次は、ShapeSheetの `User-defined Cells`(ユーザー定義セル)を使って、図形に独自の属性データを持たせる方法に挑戦してみてください。
あなたの作るツールが、誰かの業務時間を劇的に削減することを願っています。Happy Coding!
