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

スポンサーリンク

Visio VBAを掌握する:「泥臭い」エラーハンドリングこそが、最強の自動化への道

こんにちは。Visioの深淵を覗き込み、数多の自動化プロジェクトを死線から救い出してきたアーキテクトです。

「マクロの記録」ボタンを押して、生成されたコードをそのまま動かそうとして、「オブジェクトが見つかりません」というエラーで画面がフリーズした経験はありませんか?

Visioのオブジェクトモデルは、ExcelやWordに比べて非常に繊細です。図形(Shape)がロックされていたり、ページが削除されていたり、あるいは参照先のマスターシェイプが壊れていたり……。現場のVisioファイルは、常に「いつ壊れてもおかしくない」という緊張感と隣り合わせです。

今回は、そんな現場で生き残るための「Visio VBAエラーハンドリングの極意」を伝授します。これさえ理解すれば、あなたのマクロは「動かしてみないと分からない」という不安から解放されます。

なぜ「On Error GoTo」が不可欠なのか?

初学者が陥りやすい罠は、エラーを無視すること(`On Error Resume Next`の乱用)です。これは「火事を隠して家を燃やす」ようなもの。

私たちが目指すのは、「エラーが起きたら即座に検知し、ログに記録し、何事もなかったかのように安全に後始末をして終了する」という、プロフェッショナルなリカバリ・アーキテクチャです。

現場で戦うための「定石テンプレート」

まずは、私が現場で必ず使う「鉄板の構造」を見てください。

Public Sub SafeVisioProcess()
‘ 1. エラーハンドラへの誘導
On Error GoTo ErrorHandler

‘ — メイン処理開始 —
Dim shp As Visio.Shape
Set shp = ActivePage.Shapes(1) ‘ ここでエラーが起きる可能性がある

Debug.Print “処理成功: ” & shp.Name
‘ — メイン処理終了 —

ExitHandler:
‘ 2. クリーンアップ処理(成功時も失敗時も必ず通る)
Set shp = Nothing
Exit Sub

ErrorHandler:
‘ 3. エラーの内容を記録し、ユーザーに通知
Dim errMsg As String
errMsg = “Error #” & Err.Number & “: ” & Err.Description

‘ ログファイルへの出力(実務ではテキストファイル等へ追記するのが理想)
Debug.Print “★エラー発生: ” & Now & ” | ” & errMsg
MsgBox “処理中に問題が発生しました。詳細はイミディエイトウィンドウを確認してください。”, vbCritical

‘ エラー後、安全にExitHandlerへ戻る
Resume ExitHandler
End Sub

コードを読み解く:3つの重要ポイント

1. `On Error GoTo ErrorHandler`

これは、Visioに対する「何かあったら、このラベルの場所まで飛んで報告してくれ」という命令です。これがないと、Visioは無慈悲なシステムエラーダイアログを出して、処理を強制終了させてしまいます。

2. `ExitHandler` の役割

ここが最も重要です。「エラーが発生したとき」だけでなく、「正常に終わったとき」もここを通るように設計します。例えば、開いたファイルや、接続した外部データベースの参照を切る(`Set obj = Nothing`)処理をここに集約することで、メモリリークを防ぎ、Visioの不安定化を回避します。

3. `Resume ExitHandler`

エラーの報告が終わったら、必ず `Resume` を使って元のルート(`ExitHandler`)に戻します。これを忘れると、エラー処理の最中に次のエラーが起きた際、Visioがパニックを起こしてクラッシュします。

よくあるエラーと「現場の処方箋」

Visio VBAで頻出するエラーの多くは、以下のいずれかです。

  • 「インデックスが有効範囲にありません」: ページやシェイプを削除してしまった場合です。ループ処理の際は、必ず `If Not shp Is Nothing Then` で存在チェックを入れましょう。
  • 「オブジェクトが必要です」: `Set` を忘れていませんか? Visioのオブジェクトは代入時に `Set` が必須です。
  • 「この操作は保護されているため実行できません」: 読み取り専用ファイルや、ロックされたレイヤーを操作しようとしています。

現場のエンジニアからの一言

「完璧なコード」を書こうとしないでください。代わりに「エラーが起きても被害を最小限に留めるコード」を書いてください。

Visioの図形は、あなたが操作するたびに少しずつ消耗します(メモリ上の話ですが)。だからこそ、使い終わったら必ず参照を解放し、ログを吐き出し、静かに終了する。この「泥臭い」配慮こそが、世界最高峰のエンジニアが持っている「コードへの優しさ」なのです。

さあ、次のステップへ

今回の知識を身につければ、もう「マクロの記録」で生成されたコードがエラーで止まるたびに、冷や汗をかく必要はありません。

まずは、今書いているコードに `ErrorHandler` を1つ追加してみてください。それだけで、あなたのVBAライフは劇的に安定します。

分からないことや、もっと深いVisioの闇(オブジェクトモデルの最適化など)について知りたいことがあれば、いつでも聞いてください。プロフェッショナルへの道は、一歩ずつ、着実なエラーハンドリングから始まります。

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