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

スポンサーリンク

Visio ShapeSheetの深淵:VBAで「動的な制約」をコード化する極意

Visioを単なる図形描画ツールだと思っているなら、あなたはまだその真の力を引き出せていない。Visioの本質は「形状の背後に存在する計算エンジン」にある。それがShapeSheetだ。

多くの開発者が`Shape.Text`や`Shape.Cells(“Width”)`をいじって満足しているが、真の自動化エンジニアは、VBAからShapeSheetの「数式」を書き換え、シェイプ自身に思考(ロジック)を持たせる。

本稿では、VBAを用いてShapeSheetの数式を操作し、ガード関数(`GUARD`)を駆使して「絶対に壊れない自動化ツール」を構築する極意を伝授する。

1. なぜ「値」ではなく「数式」を操作すべきなのか

初心者はVBAで `shp.Cells(“Width”).ResultIU = 10` と書きがちだ。しかし、これではユーザーが手動でシェイプを伸縮させた瞬間にロジックが破綻する。

真の設計思想は「数式を注入すること」にある。
`FormulaU` プロパティを使い、`Width = GUARD(Sheet.1!Width 0.5)` のようにセルの計算式を定義せよ。これにより、連動元が変化すれば自動で追従する「ライブ・ダイアグラム」が完成する。

2. プロダクション環境で必須の「ガード」テクニック

ユーザーによる誤操作を防ぐために、`GUARD` 関数は必須だ。VBAから数式を流し込む際は、以下の設計を徹底すること。

実践:動的制約を付与するコード

以下のコードは、対象シェイプの幅を「親シェイプの幅の半分」に固定し、ユーザーの手動リサイズを無効化する例だ。

‘ @brief シェイプに保護された数式を注入するメソッド
‘ @param shp 対象のVisioシェイプ
‘ @param targetCellName セル名(Width, Heightなど)
‘ @param formula 注入する数式(例: GUARD(Width0.5))
Public Sub SetProtectedFormula(ByRef shp As Visio.Shape, _
ByVal targetCellName As String, _
ByVal formula As String)
On Error GoTo ErrHandler

‘ セルが存在するか確認(存在しない場合は処理をスキップまたはエラーハンドリング)
If shp.CellExistsU(targetCellName, False) Then
‘ FormulaUを使用すること(国際化対応の観点からU推奨)
shp.CellsU(targetCellName).FormulaU = “=” & formula
End If

Exit Sub
ErrHandler:
Debug.Print “Error: ” & Err.Description
End Sub

‘ 使用例
Sub Example_ApplyGuard()
Dim shp As Visio.Shape
Set shp = ActivePage.Shapes(1)

‘ 幅を半分に固定し、ガードをかける
Call SetProtectedFormula(shp, “Width”, “GUARD(Width0.5)”)
End Sub

3. 堅牢な設計のための3つの鉄則

現場でトラブルを起こさないために、以下の規律を守ってほしい。

1. 単位の呪縛から逃れよ (ResultIU vs FormulaU)

`ResultIU` は「現在の値」を操作するが、`FormulaU` は「数式」を操作する。外部データベースから取得した値を反映させる際も、安易に値を直書きせず、`GUARD` を併用してユーザーの手動介入を排する設計にせよ。

2. シート参照の相対化

数式内に `Sheet.1` のようなIDを直書きしてはいけない。シェイプが別のページに移動した瞬間、リンクが切れるからだ。

  • `ThePage` や `TheSheet` などの関数、あるいは `User.Value` セルを中継点として利用し、相対的な依存関係を構築する。

3. イベントハンドラの連鎖に注意

VBAから `FormulaU` を書き換えると、`Shape.CellChanged` イベントが発火する。この中でさらに別のセルを書き換えると、無限ループが発生しVisioがフリーズする。
必ず `Application.DeferRecalc = True` を使用し、処理の最後で一括計算せよ。

4. データベース連携時のベストプラクティス

外部のSQL ServerやExcelから動的に図面を生成する場合、ShapeSheetの `User` セルを活用せよ。

1. メタデータの格納: シェイプの `User.DatabaseID` などのカスタムセルに、DBの主キーを書き込む。
2. 数式の紐付け: `Width` セルなどに `GUARD(LOOKUP(User.DatabaseID, …))` のような数式を埋め込む。

これにより、VBAは「図形を描画する」という重い責務から解放され、「データをShapeSheetに流し込む」というクリーンな責務に集中できる。描画の計算(レイアウト)は、Visioの描画エンジンに任せるのが最もパフォーマンスが良い。

最後に:アーキテクトからの助言

VBAを書くことは、Visioという巨大なOSの上に、あなただけの「専用アプリケーション」を構築する行為だ。

もしあなたがコードをコピペして動いたことに満足しているなら、それはまだ入り口に過ぎない。「ユーザーがどう触っても壊れない数式を、VBAでどう生成するか」。ここを突き詰めた時、あなたの作成した自動化ツールは、単なる「作業用スクリプト」から「組織の資産」へと昇華する。

さあ、ShapeSheetの深淵を制御し、真の自動化を体現せよ。

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