【実務・中級編】Visio VBAの例外ハンドリング完全版:On Error GoToを用いた泥臭いエラーリカバリとログ出力 – Visio VBA解析バイブル

スポンサーリンク

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` だったらどうなるか?」を想像してコードを書いてほしい。

もし、貴方の書くツールがエラーを吐いて停止するなら、それはまだ「おもちゃ」だ。上記のテンプレートを叩き込み、運用に耐えうる「武器」へと昇華させろ。

何か具体的な実装で詰まっている箇所があれば、いつでも議論しよう。健闘を祈る。

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