【入門編】シェイプシート(ShapeSheet)の数式ハック:VBAからCellsU経由でガードや数式を操る – Visio VBA解析バイブル

スポンサーリンク

Visioの心臓を掌握せよ:ShapeSheetをVBAで操る「ガード」と「数式ハック」の極意

こんにちは。Visioの自動化という深淵に足を踏み入れた皆さん、ようこそ。

多くのユーザーが「マクロの記録」で生成された冗長なコードに失望し、Visio VBAは「使いにくい」と諦めて去っていきます。しかし、それは大きな誤解です。Visioの真の力は、画面上のグラフィックスではなく、その裏側に隠された「ShapeSheet(シェイプシート)」というデータベースに宿っています。

今日は、VBAを使ってこの心臓部を直接書き換え、シェイプを「壊れない、賢い自動化パーツ」へと進化させる極意を伝授します。

1. なぜ「CellsU」なのか?:オブジェクトモデルの深淵

Visioのオブジェクトモデルにおいて、`Shape`オブジェクトは単なる図形ではありません。それは自身の座標、色、挙動を記述した「数式」を内包する小さなプログラムです。

VBAからこの数式にアクセスする際、最も信頼できるメソッドが `CellsU` です。

  • CellsU(“セル名”): セル名をユニバーサル名(英語名)で指定してアクセスする。
  • FormulaU: そのセルに格納されている「数式」そのもの。
  • ResultIU: その結果(数値)。

ここで重要なのは、`FormulaU` を使う点です。単に数値を代入するのではなく、「数式そのものを注入する」という感覚が、Visio自動化の第一歩です。

2. 実践:ガード(Guard)でシェイプを「凍結」する

開発現場でよくある悲劇は、ユーザーが誤ってシェイプのサイズを変更し、レイアウトが崩壊することです。これを防ぐのが `GUARD` 関数です。

例えば、Width(幅)を固定し、ユーザーが手動でいじれないようにするコードを見てみましょう。

Sub ProtectShapeWidth()
Dim shp As Visio.Shape
Set shp = ActivePage.Shapes(1) ‘ 選択中の最初のシェイプを対象

‘ Widthセルに GUARD 関数を適用した数式を注入
‘ GUARD(式) とすることで、ユーザーによるサイズ変更を無効化する
shp.CellsU(“Width”).FormulaU = “GUARD(2 in)”

MsgBox “シェイプの幅を2インチに固定し、ガードをかけました。”
End Sub

【ここがポイント】

  • `GUARD`関数で囲むと、Visioはそのセルの値が手動操作で変更されるのを拒絶します。
  • 「2 in」という単位付きの文字列を渡すのがポイントです。Visioは柔軟な単位系を持っているため、プログラム側で計算して単位を指定できるのです。

3. 数式ハック:動的な相関関係を作る

Visioの凄みは、シェイプ同士を数式でリンクできる点です。「親シェイプの幅が変わったら、子シェイプも自動で追従する」といった挙動は、VBAで数式を書き込むだけで実現できます。

Sub LinkShapeWidth()
‘ shpTarget の幅を shpSource の幅に常に同期させる
Dim shpSource As Visio.Shape
Dim shpTarget As Visio.Shape

Set shpSource = ActivePage.Shapes(“SourceShape”)
Set shpTarget = ActivePage.Shapes(“TargetShape”)

‘ Targetの幅に、Sourceの幅を参照する数式を書き込む
‘ “Width” は自分自身、”Sheet.1!Width” は参照先を指定
shpTarget.CellsU(“Width”).FormulaU = “Sheet.” & shpSource.ID & “!Width”

Debug.Print “動的リンクを構築しました。”
End Sub

4. 陥りやすい罠と解決策

初学者が必ず突き当たる「エラーの壁」があります。

Q: 「FormulaU」でエラーが出る!

  • 原因: 指定したセル名がそのシェイプに存在しない(またはスペルミス)。
  • 対策: シェイプシートを手動で開き([開発]タブ > [シェイプシートの表示])、対象のセル名が何であるかを確認してください。`Width`, `Height`, `PinX`, `PinY` は基本中の基本ですが、セクションによって名前が異なります。

Q: 数式が反映されない!

  • 原因: Visioの再計算待ち。
  • 対策: `Application.Calculate` を呼び出す必要は基本ありませんが、複雑な依存関係を作る場合は、一度 `ActiveWindow.DeselectAll` 等を行い、描画をリフレッシュさせると確実です。

最後に:エンジニアとしての心構え

Visio VBAは「図形を動かす道具」ではなく、「図形に知性を与える道具」です。

今回紹介した `FormulaU` を使いこなせるようになると、数千個のシェイプを一つずつ手作業で調整する苦行から解放されます。数式という名の「ルール」をシェイプに埋め込み、あとはVisio自身の強力な再計算エンジンに仕事を任せる。これこそが、世界最高峰の自動化エンジニアが辿り着く境地です。

まずは、適当なシェイプを一つ作成し、`CellsU(“LockWidth”).FormulaU = 1`(幅固定)を試してみてください。その小さな一歩が、あなたの自動化の旅を劇的に変えるはずです。

何か疑問があれば、いつでも聞いてください。皆さんのコードが、エレガントに動くことを祈っています。

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