Visioが「#VALUE!」で沈黙した時、最強のリカバリ術を伝授しよう。
Visioで複雑な図形を作成していると、ある日突然、ShapeSheetの数式が「#VALUE!」と表示され、操作を受け付けなくなる……そんな悪夢のような瞬間に出くわしたことはありませんか?
通常の `Cell.Formula = “…”` では弾かれてしまうその状態は、Visioの描画エンジンがエラーの連鎖で「思考停止」しているサインです。今日は、そんな絶望的な状況を打開し、図形を正常な状態へ強制復帰させる「外科手術級」のVBAテクニックを伝授します。
—
1. なぜ「#VALUE!」は消えないのか?
VisioのShapeSheetは、セル同士が数式で密接に絡み合っています。どこか一つの数式が破綻すると、依存関係にある他のセルも次々と汚染され、Visioは「再計算の無限ループ」を避けるために保護モードに入ります。
この時、普通に値を書き込もうとしても、Visioは「今の計算状態では書き込めません」と門前払いしてきます。ここで必要になるのが、「再計算を一時停止させ、強引に正しい数式を埋め込む」という二段構えのアプローチです。
—
2. 禁断のリカバリ・テクニック:DeferRecalc と FormulaForceU
この二つのメソッドは、Visio APIの中でも「特権階級」に属します。
- `Application.DeferRecalc = True`: Visioの「脳」とも言える再計算エンジンを一時的にストップさせます。これで、エラーの連鎖による干渉を遮断します。
- `Cell.FormulaForceU`: 通常の `Formula` とは異なり、エラー状態であっても、ガードを無視して数式を強制的に上書きします。まさに「外科手術」のメスです。
—
3. 実装コード:図形を救い出す「強制復旧スクリプト」
以下のコードは、選択した図形の特定のセルを強制的にリセットするサンプルです。これを理解できれば、Visio VBAの基礎は完全にクリアしたと言っても過言ではありません。
Public Sub ForceRecoverShapeFormula()
Dim vsoShape As Visio.Shape
Dim vsoCell As Visio.Cell
‘ 1. 選択している図形を取得
If ActiveWindow.Selection.Count = 0 Then
MsgBox “対象の図形を選択してください。”
Exit Sub
End If
Set vsoShape = ActiveWindow.Selection(1)
‘ 2. Visioの再計算エンジンを停止(ここが重要!)
‘ これにより、計算エラーによる拒絶反応を防ぎます
Application.DeferRecalc = True
On Error Resume Next ‘ 万が一の異常終了に備える
‘ 3. エラーが発生しているセル(例: Width)を強制上書き
‘ FormulaForceUは「エラーがあっても強引に書き換える」強力なメソッド
Set vsoCell = vsoShape.Cells(“Width”)
vsoCell.FormulaForceU = “Width1” ‘ ここに正しい数式を注入
‘ 必要に応じて他のセルも修正
‘ vsoShape.Cells(“Height”).FormulaForceU = “50 mm”
‘ 4. 再計算エンジンを再開
Application.DeferRecalc = False
‘ 5. 強制的に再計算を促す(念のため)
vsoShape.Application.ActivePage.Layout
On Error GoTo 0
MsgBox “復旧プロセスが完了しました。図形を確認してください。”
End Sub
—
4. このコードを使いこなすための3つの心得
① `DeferRecalc` は必ず `False` に戻す
`DeferRecalc = True` のまま放置すると、Visioの画面描画が止まったままになり、最悪の場合Visioが応答なしになります。必ず `False` に戻す(あるいはエラーハンドリング内で確実に解除する)クセをつけましょう。
② 「U」のつくメソッドを使う理由
`FormulaForceU` の「U」は Universal の略です。ローカライズ(言語設定)に依存せず、常に英語ベースの数式を解釈してくれます。日本語環境と英語環境を行き来するようなプロフェッショナルな現場では、常に「U」付きのメソッドを使うのが鉄則です。
③ なぜマクロの記録ではダメなのか
マクロの記録は「ユーザーの操作」をなぞるだけです。今回のような「システムが拒絶している状態」を操作するAPIは記録されません。このレベルの操作ができるようになると、マクロの記録という「入門者」の殻を脱皮し、真の「Visio自動化エンジニア」への階段を登ったことになります。
—
最後に:Visioを支配する喜び
VisioのShapeSheetは奥が深く、時に気難しい相棒のように感じるかもしれません。しかし、今回のようなAPIの本質を知れば、どんなに複雑なエラーも恐れることはありません。
「エラーを消す」のではなく「構造を強制的に正す」。この視点を持てたなら、あなたの自動化スキルは格段にレベルアップしています。次回のVisio開発では、ぜひこの「外科手術」を試してみてください。
あなたの開発ライフが、より効率的でストレスフリーなものになることを願っています!
