【入門編】図面の自動レイアウト再計算:Page.LayoutおよびPage.LayoutChangeDirectionの完全自動化 – Visio VBA解析バイブル

スポンサーリンク

ようこそ。Visioの深淵なる世界へ。
マクロの記録ボタンを押して「なんとなく動いた」ことに満足する段階は、今日で卒業しましょう。

今回は、Visioの心臓部である「自動レイアウトエンジン」をVBAで制御し、カオスな図面を瞬時に整然としたフロー図へと昇華させる極意を伝授します。

1. なぜVisioの「自動レイアウト」をVBAで制御するのか?

大量のシェイプを配置したとき、線が交差し、配置が歪み、見るに堪えない図面になることがありますよね。マウスで一つずつドラッグするのは、エンジニアの仕事ではありません。

Visioには強力な「自動レイアウトエンジン」が備わっています。しかし、GUIのボタンをポチポチ押すだけでは、現場の複雑な要件には対応できません。「このシートだけは横方向に流し、あちらのシートはツリー構造で展開する」といった動的な制御こそが、VBAによる自動化の真髄です。

2. 覚えておくべき「4つの重鎮」

コードを叩く前に、Visioが世界をどう認識しているかを知ってください。

  • Application: Visioという巨大な工場そのもの。
  • Document: 設計図(ファイル)。
  • Page: 作業台。ここでレイアウトの再計算が行われます。
  • Shape: 部品。これらがどう繋がっているかがレイアウトの鍵です。

3. 実践:自動レイアウト再計算のコード

それでは、アクティブなページ内のシェイプを、右方向へ流れるフロー図として再計算させるスクリプトを共有します。

Sub AutoLayout_Flowchart_Right()
‘ 賢いエンジニアは常にオブジェクトを明示する
Dim vsoPage As Visio.Page
Set vsoPage = ActivePage

‘ レイアウト設定の準備
‘ Page.Layoutメソッドは引数によって挙動が激変する「魔術師」です
‘ visLOFlowRight: 右方向への流れを指定
‘ visLORectLine: 直線的なコネクタを優先

On Error Resume Next ‘ 予期せぬエラーで止まらないための防波堤

‘ ページ全体のレイアウトを再計算
vsoPage.Layout visLOFlowRight + visLORectLine, _
visLORegroupComponents, _
visLOApplyToAll

If Err.Number <> 0 Then
MsgBox “レイアウトの再計算に失敗しました。シェイプの接続関係を確認してください。”
Else
Debug.Print “レイアウトの再計算が完了しました。”
End If

On Error GoTo 0
End Sub

コードの解説:ここが肝!

  • `visLOFlowRight`: ここを変えるだけで、下方向(`visLOFlowDown`)や円状配置など、自由自在にレイアウトを変更できます。
  • `visLOApplyToAll`: ページ上の全シェイプを対象にするという宣言です。これを忘れると、一部のシェイプが取り残される悲劇が起きます。
  • エラーハンドリング: 自動レイアウトは、コネクタが正しく接続されていないと失敗します。`On Error`で囲むのは、自動化における最低限の嗜みです。

4. 陥りやすい「3つの落とし穴」

初学者が必ず突き当たる壁です。先回りして回避術を授けます。

1. 「コネクタが繋がっていない」: 自動レイアウトは「接続関係」を元に動きます。見た目が繋がっていても、シェイプの接続ポイントにコネクタが刺さっていないと、Visioは「これらは無関係だ」と判断します。
2. 「グループ化の罠」: グループ化されたシェイプは、レイアウトエンジンから見て「巨大な一個の塊」として扱われます。複雑な図面を作るなら、グループ化は慎重に行いましょう。
3. 「ロックされたシェイプ」: ShapeSheetで位置をロックしているシェイプは、自動レイアウトの影響を受けません。動かない場合は、プロパティの「保護」を確認してください。

5. 次のステップへ

今回のコードはあくまで「基本の型」です。
現場で本当に必要とされるのは、「特定の条件に一致するシェイプだけを抽出してレイアウトする」といった応用です。

例えば、`For Each vsoShape In vsoPage.Shapes` とループを組み合わせれば、特定の属性を持つシェイプだけを整列させることも可能です。

VisioのVBAは、単なる事務作業の効率化ツールではありません。「図面という構造データを、プログラムで操作する」という、非常に高度なエンジニアリング領域です。

ここをクリアしたあなたは、もう初心者ではありません。次は、ShapeSheetの中身をVBAで書き換える「深淵」へ向かいましょう。何かあれば、いつでも聞きに来てくださいね。応援しています。

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