【入門編】コネクタ付き図形の連鎖的動的生成:Page.DropConnectedメソッドによる配線自動化 – Visio VBA解析バイブル

スポンサーリンク

こんにちは!Visio VBAの奥深い世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」という段階を卒業し、いよいよ自分の手でロジックを組み上げようとしているあなたへ、最高にエキサイティングな技術をお伝えします。

今回は、Visio VBAにおける真の自動化の醍醐味──`Page.DropConnected`メソッドを使った、コネクタ付き図形の連鎖的動的生成について徹底解説します。

ネットワーク構成図やフローチャートをプログラムで自動生成するとき、「親図形をここに置いて、座標を計算して、コネクタを引っ張って、端と端を接着して……」とやっていませんか?
実は、そんな面倒な位置計算や接続の手間は一切不要です。`DropConnected`を使えば、「この図形の右側に、新しい図形を置いて、かつコネクタで繋いでおいて!」たったこれだけの指示で、Visioが勝手にすべてを裏側で完結させてくれます。

ここをクリアすれば、あなたのVisio VBAスキルは「初学者」の領域を抜け出し、確かな「業務自動化エンジニア」の扉を開くことになります。さあ、一緒に本質を学んでいきましょう!

1. 従来の「泥臭い配線」と何が違うのか?

まず、Visio VBAの基本構造を少しだけおさらいしましょう。Visioのオブジェクトモデルは、次のような階層構造になっています。

  • `Application` (Visioアプリ全体)
  • `Document` (開いているファイル)
  • `Page` (キャンバス・図面ページ)
  • `Shape` (ページ上に配置された個々の図形)

通常、シェイプをプログラムで配置して接続する場合、以下のような手順を踏む必要がありました。

1. `Page.Drop`で親シェイプを配置する(座標を指定)。
2. `Page.Drop`で子シェイプを配置する(親からの相対距離を自分で計算して座標を指定)。
3. `Page.Drop`でコネクタを配置する。
4. コネクタの始点を親シェイプのグルーブ(接続ポイント)に接着する(GlueTo)。
5. コネクタの終点を子シェイプの接続ポイントに接着する。

……想像しただけでコードが冗長になり、座標計算のミスで図形が重なったり変な方向を向いたりするバグの温床になりますよね。

救世主 `DropConnected` の登場

この「配置・計算・接続」の地獄の三ステップを、一撃でやってくれるのが `Page.DropConnected` メソッドです。

> 「既存の図形(FromShape)に対して、どの方向(方向定数)に、どのマスター図形をドロップし、どうコネクタで繋ぐか」

これを一行で指定できるため、プログラムの可読性が劇的に上がり、バグの入り込む隙がなくなります。

2. 実践!連鎖的動的生成コード

百聞は一見に如かず。実際にフローチャートや組織図を自動で組み上げるための実践的なVBAコードを見てみましょう。
このコードは、エディタに貼り付けてそのまま実行すれば、何もないページに美しいツリー状の接続図が自動生成される仕組みになっています。

Sub CreateSmartFlowchart()
Dim vsoPage As Visio.Page
Dim shpStart As Visio.Shape
Dim shpProcess1 As Visio.Shape
Dim shpProcess2 As Visio.Shape
Dim shpEnd As Visio.Shape

‘ 1. アクティブなページを取得
Set vsoPage = ActivePage

‘ 2. ステンシル(基本フローチャート図形)を開く
Dim vsoStencil As Visio.Document
Set vsoStencil = Documents.Add(“Basic Flowchart Shapes (US units).vss”)
‘ ※環境によって日本語ステンシル名になる場合は “基本フローチャート シェイプ (メートル単位).vss” などに変更してください

On Error GoTo ErrorHandler

‘ 3. 起点となる「開始/終了」図形をページ中央付近に適当にドロップ
Set shpStart = vsoPage.Drop(vsoStencil.Masters.ItemU(“Start/End”), 4.25, 10.25)
shpStart.Text = “処理開始”

‘ 4. 【ここが本命!】DropConnectedによる連鎖的生成
‘ shpStartの「右方向(Right)」に、「プロセス(Process)」図形をドロップし、コネクタで自動接続する
Set shpProcess1 = vsoPage.DropConnected( _
shpStart, _
vsoStencil.Masters.ItemU(“Process”), _
visConnectToRight ‘ 右側に配置して接続
)
shpProcess1.Text = “データ取得”

‘ 5. さらに連鎖! shpProcess1の「下方向(Bottom)」に別のプロセスを接続
Set shpProcess2 = vsoPage.DropConnected( _
shpProcess1, _
vsoStencil.Masters.ItemU(“Process”), _
visConnectToBottom ‘ 下側に配置して接続
)
shpProcess2.Text = “データ変換”

‘ 6. 最後に「開始/終了」図形を下方向へ接続
Set shpEnd = vsoPage.DropConnected( _
shpProcess2, _
vsoStencil.Masters.ItemU(“Start/End”), _
visConnectToBottom
)
shpEnd.Text = “処理終了”

‘ ステンシルを閉じる
vsoStencil.Close

MsgBox “自動配線によるフローチャートの生成が完了しました!”, vbInformation
Exit Sub

ErrorHandler:
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
If Not vsoStencil Is Nothing Then vsoStencil.Close
End Sub

コードの重要ポイント解説

  • `vsoPage.DropConnected(FromShape, Master, Direction)`
  • 第1引数 (`FromShape`): 基準となる既存のシェイプオブジェクト。
  • 第2引数 (`Master`): 新しく配置したいマスターシェイプ。
  • 第3引数 (`Direction`): どこに配置するかを決めるVisio組み込み定数。
  • `visConnectToRight` (右側)
  • `visConnectToLeft` (左側)
  • `visConnectToBottom` (下側)
  • `visConnectToTop` (上側)
  • 自動レイアウトの恩恵

開発者は「どこに座標を置けば重ならないか」を計算する必要が一切ありません。Visioのエンジンがよしなに最適な距離を保って配置し、スマートな直角コネクタ(または直線)で結んでくれます。

3. 初学者が絶対にハマる「落とし穴」と回避策

実務でこの `DropConnected` を使い始めると、いくつかの「お約束のトラップ」に遭遇します。先輩エンジニアからのアドバイスとして、事前に頭に入れておきましょう。

トラップ1: ステンシル(マスター)の読み込み忘れ・名称違い

`DropConnected` の第2引数には、メモリ上にロードされているマスターシェイプを指定する必要があります。
よくあるエラーが 「そんなアイテムは見つかりません(Error 9)」 というもの。これは、指定したステンシルが裏で開かれていないか、Visioの言語設定(英語名 `Process` なのか、日本語名 `プロセス` なのか)がコードと一致していないことが原因です。

  • 対策: 可能な限り `.ItemU`(UはUniversalの意。言語に依存しない英語名)を使用するか、事前に確実にステンシルを開く処理をコードに含めましょう。

トラップ2: 戻り値のオブジェクトがNothingになる

何らかの原因で接続に失敗した場合、メソッドはエラーを吐くか、`Nothing` を返します。そのまま `.Text` などのプロパティを操作しようとすると、「オブジェクト変数が設定されていません(Error 91)」のランタイムエラーが発生します。

  • 対策: 複雑なループや動的生成を行う際は、生成された直後のオブジェクトが `Nothing` でないかを `If Not shp Is Nothing Then` でガードする防衛的プログラミングを心がけましょう。

まとめ:自動化の可能性は無限大

今回は、`Page.DropConnected` メソッドを使った図形の連鎖的動的生成について解説しました。

このテクニックをマスターすれば、データベースから取得したマスターデータ(例えば、サーバー構成情報のリストや、社内の承認フロー定義)を読み込ませるだけで、ボタンひとつで数分かかる巨大なシステム構成図や業務フローチャートを、一瞬で描画し尽くすシステムを構築できます。

マクロの記録の枠を飛び出し、オブジェクトモデルを意のままに操る快感。
「ここをクリアすれば、Visio VBAの基本はバッチリですよ!」
ぜひ今日のコードをご自身の環境で動かして、自動化の魔法を体感してください。あなたのVBAライフが、より一層素晴らしいものになることを応援しています!

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