Visio VBAの「死」を回避せよ:現場で生き残る堅牢な例外ハンドリングのアーキテクチャ
Visioでの自動化において、コードを書いて終わりだと思っているなら、それはまだアマチュアだ。Visioのオブジェクトモデルは、不安定な図面データやユーザーの予測不能な操作によって、いとも簡単に「予期せぬエラー」を吐き出す。
業務自動化ツールが「エラーで止まりました」と言って作業を中断させることは、現場の信頼を失うことを意味する。プロフェッショナルなツールは、壊れやすいVisioの環境下でも、沈黙を守り、ログを吐き出し、静かに後始末を完了させる。
今日は、私が実戦で採用している「例外ハンドリングの極意」を伝授する。
—
1. なぜ「On Error Resume Next」に逃げてはいけないのか
多くの初心者がやる過ちは、`On Error Resume Next` を乱用してエラーを握りつぶすことだ。これは「病気を鎮痛剤で誤魔化して放置する」のと同義だ。その結果、Visioはメモリリークを起こし、ドキュメントの整合性は崩れ、最後にはクラッシュする。
我々が目指すべきは、「エラーを検知し、状況を特定し、安全に退却する」仕組みである。
—
2. 現場で使える「堅牢なエラーハンドリング」テンプレート
以下に示すのは、私がプロダクション環境で標準としているテンプレートコードだ。この構造を守るだけで、あなたのツールは格段に安定する。
Public Sub RobustProcess()
‘ 1. エラーハンドラへのジャンプを設定
On Error GoTo ErrorHandler
‘ — 本来の処理を開始 —
Dim vsoPage As Visio.Page
Set vsoPage = ActivePage ‘ ここでドキュメントが空だとエラーになる
‘ 例:図形操作
Dim shp As Visio.Shape
Set shp = vsoPage.Shapes(1) ‘ 図形が存在しない可能性を考慮
‘ — 正常終了時の処理 —
Exit Sub
ErrorHandler:
‘ 2. エラーの詳細をログへ記録
Call WriteErrorLog(“RobustProcess”, Err.Number, Err.Description)
‘ 3. ユーザーへの通知(必要最小限)
MsgBox “予期せぬエラーが発生しました。詳細はログを確認してください。”, vbCritical
‘ 4. クリーンアップ(ここが最重要)
‘ 開いたファイル、データベース接続、一時オブジェクトの破棄を必ず行う
Set vsoPage = Nothing
Set shp = Nothing
‘ 5. プログラムの終了
Resume Next ‘ 必要に応じて処理を続行、または終了処理へ
End Sub
‘ ログ出力用プロシージャ(保守性の要)
Private Sub WriteErrorLog(procName As String, errNum As Long, errDesc As String)
Dim logPath As String
logPath = Environ(“USERPROFILE”) & “\Desktop\Visio_Error.log”
Dim fileNo As Integer
fileNo = FreeFile
Open logPath For Append As #fileNo
Print #fileNo, Now & ” | Proc: ” & procName & ” | Err: ” & errNum & ” | Desc: ” & errDesc
Close #fileNo
End Sub
—
3. 現場特有の「Visioの罠」への対策
ファイル・DB連携時の注意点
VisioのVBAでExcelやデータベースと連携する場合、「Visioがクラッシュしても、相手側の接続は残る」という最悪のケースが起こり得る。
- 接続の管理: 外部リソース(ADO接続やFileSystemObject)は、必ず `ErrorHandler` 内で明示的に `Close` すること。
- 状態のリセット: `Application.ScreenUpdating` を `False` にしている場合、エラー発生時に `True` に戻さないと、Visioの画面描画が死んだままになる。
なぜこの設計が最強なのか
1. 分離の原則: エラーログ出力機能を別プロシージャに切り出すことで、保守が容易になる。
2. クリーンアップの保証: `ErrorHandler` を通ることで、オブジェクト変数(`Set = Nothing`)の開放が漏れない。
3. トレーサビリティ: どのプロシージャで何が起きたか一目瞭然であるため、デバッグ工数が劇的に減る。
—
4. チーフアーキテクトからの助言
「バグのないコード」を目指すのは幻想だ。プロフェッショナルの仕事とは、「バグが起きてもシステム全体を崩壊させない設計」のことである。
Visioは巨大なオブジェクトの集合体だ。`Application` から `Shape` まで、階層構造を意識し、常に「このオブジェクトが `Nothing` だったらどうなるか?」を想像してコードを書いてほしい。
もし、貴方の書くツールがエラーを吐いて停止するなら、それはまだ「おもちゃ」だ。上記のテンプレートを叩き込み、運用に耐えうる「武器」へと昇華させろ。
何か具体的な実装で詰まっている箇所があれば、いつでも議論しよう。健闘を祈る。
