こんにちは!Visioでの配線図やフローチャート作成、マウスでチマチマとコネクタを繋ぐ作業にうんざりしていませんか?「あっちの図形からこっちの図形へ、綺麗に線を伸ばしたいだけなのに、なぜこんなにイライラするんだ…」と思ったことがあるなら、あなたはもうプログラミングの扉を叩く準備ができています。
今回は、マスターシェイプ(図形ステンシル)を使わずに、VBAのコードだけでダイナミックにコネクタを生成し、2つの図形をスマートに自動ルーティングする方法を伝授します。
ここをクリアすれば、Visio VBAの基本構造、そしてオブジェクト同士を繋ぐ「接着(Glue)」の概念が一気に理解できるようになります。さあ、マウスを置いてキーボードに向かいましょう!
—
1. Visio VBAの基本骨格と「接続」の本質
まず、Visioのオブジェクトモデルのピラミッドを頭に叩き込みましょう。
Visioの世界は、`Application`(アプリ) > `Document`(ファイル) > `Page`(キャンバス) > `Shape`(図形・コネクタ) という階層構造で成り立っています。
マウス操作で図形をコネクタで繋ぐとき、裏側では何が起きているでしょうか?
VBAでそれを再現するには、以下の3ステップを踏みます。
1. 起点と終点の図形(Shape)を用意する
2. コネクタ(Connector)という特殊な図形をページ上に生み出す
3. コネクタの両端を、起点・終点の図形に「グルー(接着)」する
この「グルー(糊付け)」の仕組みこそが、Visio VBA職人への第一歩です。それでは、実際のコードを見ていきましょう。
—
2. 実践!2つの図形を自動で結ぶVBAコード
以下のコードは、アクティブなページ上に2つの四角形(矩形)を自動生成し、その間をコネクタでピタッと自動ルーティングする実用的なマクロです。
VBE(Visual Basic Editor)を開き、標準モジュールにペーストして実行してみてください。
Sub CreateAndConnectShapes()
Dim vsoPage As Visio.Page
Dim shpFrom As Visio.Shape
Dim shpTo As Visio.Shape
Dim shpConnector As Visio.Shape
‘ 1. 現在アクティブなページを取得する
Set vsoPage = ActivePage
‘ 2. 起点となる図形を生成する(左側)
‘ DrawRectangle(x1, y1, x2, y2) : 単位はインチ(Visioの内部単位)
Set shpFrom = vsoPage.DrawRectangle(1, 5, 2.5, 4)
shpFrom.Text = “起点シェイプ”
‘ 3. 終点となる図形を生成する(右側・下側)
Set shpTo = vsoPage.DrawRectangle(5, 2, 6.5, 1)
shpTo.Text = “終点シェイプ”
‘ 4. コネクタを動的に生成する
‘ DrawConnector()メソッドで、ルーティング機能を持った生コネクタを作成
Set shpConnector = vsoPage.DrawConnector()
shpConnector.Text = “自動配線”
‘ 5. コネクタの「始点(BeginX)」を、起点図形の「中心(PinX/PinY)」にグルーする
shpConnector.CellsU(“BeginX”).GlueTo shpFrom.CellsU(“PinX”)
‘ 6. コネクタの「終点(EndX)」を、終点図形の「中心(PinX/PinY)」にグルーする
shpConnector.CellsU(“EndX”).GlueTo shpTo.CellsU(“PinX”)
‘ 7. 画面を最新の状態に更新
vsoPage.Window.DeselectAll
MsgBox “図形の生成と自動ルーティングが完了しました!”, vbInformation, “Visio VBA 成功”
End Sub
—
3. コードの急所を徹底解説:なぜこれで繋がるのか?
初心者の方が一番混乱する `CellsU` と `GlueTo` について、伝説的アーキテクトの視点から噛み砕いて解説します。
① `DrawConnector()` という魔法
Visioには膨大な数のステンシル(マスター)が存在しますが、コードから純粋な「線(コネクタ)」を引くときは、わざわざステンシルを開く必要はありません。`vsoPage.DrawConnector()` を叩くだけで、Visioのルーティングエンジンが搭載された純白のコネクタがページ上に爆誕します。
② `CellsU`(セル)というパラメータの塊
Visioのすべてのシェイプは、実は無数の「セル(Cell)」と呼ばれるプロパティの集合体です。
- `PinX` / `PinY`:図形の中心座標
- `BeginX` / `BeginY`:コネクタの始点の位置
- `EndX` / `EndY`:コネクタの終点の位置
「どの位置情報を狙うか」をコードで指定しているのが `CellsU(“文字列”)` です(※ `U` は Universal の略で、言語依存しない内部形式を指すプロフェッショナル向けのお作法です)。
③ `GlueTo` による強力な物理結合
ここが本日のハイライトです!
`shpConnector.CellsU(“BeginX”).GlueTo shpFrom.CellsU(“PinX”)`
この一行は、「コネクタの始まりのピンを、起点シェイプのピンに接着しなさい」という命令です。このコードが実行された瞬間、Visioの強力な自動ルーティング機能が働き、仮に後から図形をマウスで動かしたとしても、コネクタが自動で形を変えて追従するようになります。
—
4. 陥りがちな罠とエラー回避の知見
実務でこのコードを応用する際、多くの人がハマる罠がいくつかあります。事前に回避策を知っておきましょう。
罠1: 単位がインチになって図形が巨大化する?
Visio VBAの内部座標系はすべて「インチ(Inches)」で計算されます。もしミリメートル感覚で `DrawRectangle(10, 10, 50, 50)` などと書くと、キャンバスからはみ出るほどの巨大な怪物が生まれます。
- ※ミリで指定したい場合は、`Visio.VisUnitCodes.visMillimeters` を使うか、インチ換算(例: `5 mm = 5 / 25.4`)する知見を持っておくとスムーズです。
罠2: 結合(Glue)に失敗して戻り値でエラーが出る
図形がまだ完全に描画されていなかったり、存在しないセル名を指定すると、VBAは無慈悲に実行時エラーを吐きます。
- 対策として、エラーハンドリング(`On Error Resume Next` など)を安易に多用するのではなく、オブジェクトが正しく生成されているかを `If shpFrom Is Nothing Then` でガードする堅牢なコーディングを心がけましょう。
—
まとめ:ここをクリアすればVisio VBAは怖くない!
今回マスターした「図形の生成」と「`GlueTo`によるコネクタの接続」は、自動配線図システムや組織図ジェネレーターを作る際の心臓部にあたる技術です。
マウス操作をコードに置き換える快感を覚えてしまうと、もう手動には戻れなくなりますよ。ぜひご自身の業務データ(ExcelやDBなど)と組み合わせて、何百個もの図形を秒速で自動接続するマクロに挑戦してみてください。
ここをクリアしたあなたなら、どんな複雑なVisioの自動化も絶対に攻略できます。
それでは、次回の極限知見でお会いしましょう!
