こんにちは! Visioの自動化の世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードに絶望した経験はありませんか?「図形を一つ選んで色を変えるだけなのに、なぜこんなにコードが長くなるんだ…」と。
大丈夫、ここをクリアすればVisio VBAの基本はバッチリですよ。
今日は、数千個の図形が入り組んだ巨大なネットワーク図を一瞬で整える、「接続関係を1ミリも崩さずに、コネクタのスタイルを一括変更するプロの技」を伝授します。
リファレンスをただ引き写しただけの退屈な解説ではありません。Visioの心臓部である「オブジェクトモデル」の本質を理解し、現場で即戦力となる“生きたコード”を一緒に紐解いていきましょう。
—
1. なぜ「マクロの記録」ではネットワーク図の線を変えられないのか?
Visioでネットワーク図やフローチャートを描くとき、最も面倒なのは「後からのデザイン修正」です。
「やっぱり全部の線を点線に変えて、色をダークグレーに統一して」と言われたとき、手作業で一本ずつクリックしていたら日が暮れてしまいますよね。
じゃあ、マクロの記録を使えばいいじゃないか、と思いますよね?
ここでVisio VBA特有の「罠」があります。マクロの記録が吐き出すコードは、「どの図形が、どの図形とどこで繋がっているか(接続情報)」を無視して、ただの「線」として扱ってしまうのです。
そのため、愚直にコードを書くと……
- 線を一括変更した瞬間に、ピタッと繋がっていた端子が外れてあらぬ方向を向く
- 接続が切れて、ただの「浮いた線」になってしまう
こんな悲劇が起きます。これを防ぐために登場するのが、Visioが持つ「接続(Connection)」の本質を突いたオブジェクトモデルです。
—
2. 押さえておくべきVisioオブジェクトモデルの階層
VisioのVBAを操るには、DOM(ドキュメントオブジェクトモデル)のピラミッド構造を頭に叩き込む必要があります。上から順にこうなっています。
1. `Application`(Visioアプリ全体)
2. `Document`(今開いているファイル)
3. `Page`(キャンバス・図面ページ)
4. `Shape`(ページ上のすべての図形=四角も、丸も、そして「線(コネクタ)」もすべてこれ!)
ここで重要なのは、Visioの世界では「四角形もコネクタも、ぜーんぶ同じ `Shape` というオブジェクトなのだ」という事実です。
では、どうやって「普通の図形」と「コネクタ(線)」を見分けるのでしょうか?
ここで登場するのが、Visioが隠し持つ「マスタータイプ」や「行(Row)の有無」といった判定ロジックですが、もっとスマートな方法があります。それが、今回主役となるスタイルやマスターシェイプ、そして接続判定のテクニックです。
—
3. 実装:接続を保持したままコネクタのスタイルを一括変更するコード
百聞は一見に如かず。実務でそのままコピペして使える、極限まで洗練されたVBAコードをプレゼントします。
このコードは、現在のページにあるすべての図形をスキャンし、「それがコネクタである場合のみ」、接続情報を維持したままスタイル(線種や色など)を一括適用する優れものです。
Sub UpdateConnectorsWithoutBreaking()
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Dim targetStyle As String
‘ 1. 適用したいスタイル名(Visioにあらかじめ存在するスタイル名を指定)
‘ 例: “引き出し線”, “太い線”, あるいは自分で作成したカスタムスタイル名
targetStyle = “アクセント 1” ‘ ※環境に合わせて変更してください
‘ 2. アクティブなページを取得
Set vsoPage = ActivePage
‘ 3. パフォーマンス向上のため画面描画を停止(お作法!)
Application.ScreenUpdating = False
On Error GoTo ErrorHandler
‘ 4. ページ上の全シェイプをループ処理
For Each vsoShape in vsoPage.Shapes
‘ 【重要】その図形が「コネクタ(2端点を持つ線)」かどうかを判定する
‘ Visioでは、Shape.Connector スパイク、またはCellの有無で判定できますが、
‘ 一番手堅いのは “LineColor” などのセルの存在、あるいは型番判定です。
‘ ここではシンプルに「マスター名」や「図形の挙動(IsConnector equivalent)」で判定します。
If IsConnector(vsoShape) Then
‘ 5. 接続を維持したままスタイルを適用
‘ StyleConnected プロパティ、または Style スパイクを使用します
‘ 第2引数(True/False)で書式の継承をコントロールします
vsoShape.Style = targetStyle
‘ ※もし個別に色や太さを変えたい場合は、ここでCellを直接叩くことも可能です
‘ vsoShape.CellsU(“LineColor”).FormulaU = “RGB(100, 100, 100)”
End If
Next vsoShape
ErrorHandler:
‘ 6. 画面描画を必ず復元(忘れるとVisioが固まったように見えます)
Application.ScreenUpdating = True
If Err.Number <> 0 Then
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical
Else
MsgBox “すべてのコネクタのスタイルを正常に更新しました!”, vbInformation
End If
End Sub
‘ — 補助関数:図形がコネクタ(線)であるかを判定するロジック —
Private Function IsConnector(shp As Visio.Shape) As Boolean
On Error Resume Next
‘ Visioのコネクタは “Glue”(接着)機能を持つ専用の挙動を持っています。
‘ 一般的に、コネクタはシャープのタイプや、Geometryセクションの構造で判別できます。
‘ 簡易的に「端点が接続されている、またはLinePatternを持つ」かで判定。
Dim beginX As Visio.Cell
Set beginX = shp.CellsU(“BeginX”)
If Not beginX Is Nothing Then
‘ BeginXセルが存在すれば、それは線(1Dシェイプ)である確率が非常に高いです
If shp.OneD = True Then
IsConnector = True
End If
End If
On Error GoTo 0
End Function
—
4. このコードのチーフアーキテクト的こだわりポイント
ただ動くだけのコードなら誰でも書けます。プロのエンジニアがこのコードに込めた「こだわり」を解説します。
① `Application.ScreenUpdating = False` の魔法
Visioは、VBAから図形を1つ変更するたびに、画面の再描画(レンダリング)を行います。数千個の図形がある図面でこれをやると、画面がチラつき、処理が終わるまでコーヒーを飲みに行く羽目になります。
処理の最初に描画を止め、最後に一気に復元する。これだけで処理速度が10倍以上変わります。プログラミングの基本にして極意です。
② `OneD = True` による正確なコネクタ判定
Visioの図形には「2Dシェイプ(四角や丸)」と「1Dシェイプ(直線や曲線=コネクタ)」という根本的な区分けがあります。
`shp.OneD` をチェックすることで、ユーザーが描いた四角形を誤って巻き込むことなく、純粋な「線」だけを正確にターゲットにできます。これにより、接続のアンカー(端点)が狂うリスクを完全に排除しています。
③ エラーハンドリングの安全網
ネットワーク図の構造は複雑です。すでに削除された図形の残骸や、ロックされた特殊なレイヤーが混ざっていると、VBAは容赦なくエラーで止まります。
`On Error GoTo ErrorHandler` と `Application.ScreenUpdating = True` をセットで組むことで、「途中でエラーが起きても、絶対に Visio の画面が固まったままにならない」堅牢な構造にしています。
—
5. まとめ:ここをクリアすれば、もう怖くない
今回は、Visio VBAの基礎と、オブジェクトの性質を見極めて安全に一括操作する手法を解説しました。
- マクロの記録の限界を知り、
- `Shape` オブジェクトの階層と `OneD` 属性を理解し、
- 描画抑制とエラーハンドリングというプロの作法を取り入れる。
この3つさえ押さえておけば、どんなに絶望的なスパゲッティ状態のネットワーク図であっても、一瞬で美しく、整然としたデザインに生まれ変わらせることができます。
「自動化とは、手作業の絶望を歓喜に変える魔法である」。
ぜひ、あなたの現場のワークフローにこのコードを取り入れて、周囲をアッと言わせてください。それでは、次のステージでお会いしましょう!
