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