Visio VBAの「死」を回避せよ:現場で生き残るための堅牢なエラーハンドリング戦略
Visioの自動化において、初心者が最初に直面する壁。それは「マクロの強制終了」です。
「存在しないシェイプを指定した」「ロックされたレイヤーに書き込もうとした」「外部データソースが切断された」。これらの例外が発生するたびに、Visioは無慈悲に「デバッグ」ボタンを突きつけ、あなたの積み上げてきた業務効率化の努力を水泡に帰させます。
今日は、単なる「On Error GoTo」の使い方を教えるのではありません。プロフェッショナルとして、マクロを「止まらせない」ためのアーキテクチャを伝授します。
—
1. なぜ「雑なエラーハンドリング」が現場を壊すのか
多くの初心者は、コードの頭に `On Error Resume Next` を貼り付けます。これは「毒を飲んで死んだふりをする」行為です。エラーを隠蔽すると、不整合なデータがVisioファイルに書き込まれ、後から「なぜこの図面は壊れているのか?」という究極のデバッグ地獄を招きます。
我々エンジニアが目指すべきは、「起きたエラーを即座に検知し、安全にログを残し、ユーザーに状況を伝えて正常な状態へ復帰させる」というプロトコルです。
—
2. 実践的:プロダクション・レベルの例外処理テンプレート
以下のコードは、現場でそのまま使える「堅牢性」を追求したパターンです。単にエラーを無視するのではなく、「どこで、何が起きたか」を明確にすることに主眼を置いています。
Public Sub SecureShapeProcessor()
‘ エラーハンドラを定義する「定石」の入り口
On Error GoTo ErrorHandler
Dim vsoPage As Visio.Page
Dim vsoShape As Visio.Shape
Set vsoPage = ActivePage
‘ 存在しないシェイプIDへのアクセスを想定した処理
Set vsoShape = vsoPage.Shapes.Item(“NonExistentShape”)
‘ ここに本来の業務ロジックを記述
vsoShape.Text = “更新完了”
CleanExit:
‘ 終了処理(オブジェクトの解放など)
Set vsoShape = Nothing
Set vsoPage = Nothing
Exit Sub
ErrorHandler:
‘ ログ出力・ユーザー通知
Dim errMsg As String
errMsg = “エラー番号: ” & Err.Number & vbCrLf & _
“エラー内容: ” & Err.Description & vbCrLf & _
“発生場所: SecureShapeProcessor”
Debug.Print errMsg ‘ イミディエイトウィンドウに出力
MsgBox “業務処理中にエラーが発生しました。” & vbCrLf & _
“詳細はシステムログを確認してください。”, vbCritical
‘ 必要に応じてログファイルをテキスト出力する関数を呼ぶ
‘ Call WriteLogToFile(errMsg)
Resume CleanExit
End Sub
このコードの「設計思想」
1. `On Error GoTo ErrorHandler`: 局所的なエラー監視を徹底します。
2. `CleanExit`ラベル: エラーが起きても起きなくても、確実にオブジェクトを解放し、メモリリークを防ぎます。これが大規模開発での安定性を左右します。
3. `Resume CleanExit`: エラー処理が終わったら、確実に終了処理へ合流させます。
—
3. Visio特有の「落とし穴」を回避する知見
Visio VBAは、他のOfficeアプリよりも「オブジェクトの状態」に非常に敏感です。特に以下の2点には注意してください。
- ロックされた保護プロパティ: シェイプが `LockTextEdit` や `LockDelete` されている場合、プロパティ変更で即座にランタイムエラーになります。更新前に `If vsoShape.Protect = 0 Then` のように状態を確認する防御的プログラミングを徹底しましょう。
- イベントの連鎖: `ShapeAdded` などのイベントと組み合わせる際、エラーハンドラがないと、イベント内でエラーが起きた瞬間にVisioがクラッシュします。イベント駆動のコードには、常に「最も厳格な」エラーハンドラを実装してください。
—
4. 現場のリーダーからの一言
「エラーハンドリングを記述するのは面倒だ」と感じるかもしれません。しかし、エラーハンドリングをサボることは、顧客やチームメイトの時間を奪うことと同じです。
堅牢なコードは、書くときは手間がかかります。しかし、ひとたび動けば、それは深夜のトラブルコールを未然に防ぐ「最強の守護者」となります。
次にコードを書くときは、「もしここでシェイプが削除されていたら?」という想像力を働かせてください。その一歩が、あなたを単なるコード書きから、信頼されるアーキテクトへと引き上げます。
—
次回のテーマ予告:
「Visioにおける外部データベース接続:ADOを用いたSQLクエリのスマートな実装とコネクション管理」について深掘りします。お楽しみに。
