Visio VBAの真髄:コンテナ機能で「生きている図面」を構築する
こんにちは。業務自動化の世界へようこそ。
Visioで「マクロの記録」を卒業し、いよいよ自動化の深淵に足を踏み入れようとしているあなたへ。今日は、Visioの中でも特に強力、かつ「使いこなせれば達人」と称されるShape.ContainerPropertiesについて解説します。
単に図形を並べるだけの図面はもう終わりです。コードで図形を「管理」し、自動的に追従する構造化図面を作っていきましょう。
—
1. なぜ「コンテナ」なのか? ―グループ化の先にある世界
Visioには「グループ化」という機能がありますが、実はあれは「シェイプを固めて動かす」だけ。一方、「コンテナ」は、中に入れたシェイプを「管理」し、枠を広げれば中身も整列するような、いわば「意思を持った枠組み」です。
VBAでこれを制御できるようになると、以下のようなことが可能になります。
- サーバー名を入力すると、自動的に関連する機器がそのサーバー枠に吸い寄せられる。
- 大規模なネットワーク図で、ノードが増えても枠が自動で拡張される。
この「動的な構造」こそが、業務自動化におけるエンジニアリングの第一歩です。
—
2. コンテナを操るための必須オブジェクト
コンテナを操作する際、最も重要なのが `Shape.ContainerProperties` です。
これを使いこなすために、まずは以下のステップを理解してください。
1. コンテナの判定: そのシェイプがコンテナかどうかを判定する。
2. メンバーの取得: コンテナの中に何が入っているかを知る。
3. メンバーの追加: コードからシェイプをコンテナへ「所属」させる。
—
3. 【実戦コード】動的にコンテナを操作する
以下のコードは、選択したシェイプを特定のコンテナに強制的に追加し、コンテナをリサイズする一連の処理です。これを読めば、オブジェクトモデルの繋がりが見えてくるはずです。
Sub AddShapeToContainer()
Dim vsoShape As Visio.Shape
Dim vsoContainer As Visio.Shape
Dim vsoContProps As Visio.ContainerProperties
‘ 1. 現在選択している図形と、移動先のコンテナを取得(仮に名前で特定)
Set vsoShape = ActiveWindow.Selection(1)
Set vsoContainer = ActivePage.Shapes(“MyContainer”)
‘ 2. コンテナのプロパティを呼び出す
‘ ここでエラーが出る場合は、そのシェイプがコンテナではない可能性が高いです
Set vsoContProps = vsoContainer.ContainerProperties
‘ 3. シェイプをコンテナに追加する
‘ AddMemberメソッドで指定するフラグは「粘着度」のようなものです
‘ visMemberAddNoFlags はデフォルトの挙動(追従・自動整列)を適用します
vsoContProps.AddMember vsoShape, Visio.VisMemberAddFlags.visMemberAddNoFlags
‘ 4. コンテナの自動サイズ調整を有効にする(重要!)
vsoContainer.Cells(“AutoSize”).Formula = “True”
Debug.Print “シェイプを” & vsoContainer.Name & “に追加しました。”
End Sub
コードの解説と「ハマりどころ」
- `ContainerProperties` の取得: コンテナとして定義されていないシェイプに対してこのプロパティを呼び出すと、容赦なくエラーが返ります。必ず `Shape.ContainerProperties Is Nothing` ではないかを確認する習慣をつけましょう。
- `AddMember`: これを実行すると、Visioの描画エンジンがそのシェイプをコンテナの「子」として再計算します。グループ化とは違い、「所属関係」をメタデータとして持つのが最大のポイントです。
—
4. 陥りやすい罠とエンジニアの心得
初心者がよくやる間違いは、「座標計算で無理やり配置しようとすること」です。
「このコンテナのX座標に、このシェイプの幅を足して…」と計算したくなりますよね? 気持ちは分かります。しかし、コンテナ機能を使っているなら、それは無意味な努力です。
コンテナは、`AddMember` された瞬間、内部のルール(整列や余白設定)に基づいて自動配置されます。「位置を計算するのではなく、コンテナのルールに従わせる」。これが、Visio自動化で最も重要なパラダイムシフトです。
—
5. 次のステップへ
ここをクリアすれば、あなたはもうただの「VBAユーザー」ではありません。図面の「論理構造」を設計できるエンジニアです。
次は、`ContainerProperties.GetMembers` を使って、コンテナ内の全シェイプを列挙し、特定の属性を持つものだけを抽出・変更する処理に挑戦してみてください。
Visioの深淵はまだまだ奥が深いです。何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、全力でサポートします!
