【実務・中級編】初心者でも安心のVisio VBAエラーハンドリング:On Error構文で実行時例外をスマートに捉える – Visio VBA解析バイブル

スポンサーリンク

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クエリのスマートな実装とコネクション管理」について深掘りします。お楽しみに。

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