Word VBAを掌握する:『実行時エラー』を飼い慣らすための構造的ハンドリング術
こんにちは。Word VBAの世界へようこそ。
マクロの記録から一歩踏み出し、自分の思い通りにWordを操り始めると、必ずと言っていいほど直面する壁があります。それが「実行時エラー」です。
特にWordは、Excelと違って「現在選択している場所(Selection)」や「カーソルの位置」という不安定な要素に依存しがちなため、「オブジェクトが削除されました(エラー番号 4605など)」といった悪夢のようなエラーに遭遇しやすいのが特徴です。
今日は、初心者の方が陥りがちな「`On Error Resume Next` の乱用」を卒業し、プロフェッショナルな現場で通用する「エラーハンドリングの極意」を伝授します。
—
1. なぜ「On Error Resume Next」を多用してはいけないのか
多くの入門書やネット記事で紹介される `On Error Resume Next`。これは「エラーが発生しても無視して次の行に進む」という命令です。
一見便利に見えますが、これは「車のブレーキを壊したままアクセル全開で走る」のと同じです。エラーの原因(例:表が存在しないのに表を操作しようとした等)が隠蔽され、後続の処理で不可解な挙動を引き起こすため、デバッグが不可能になります。
—
2. 構造的エラーハンドリングの「黄金パターン」
プロのコードでは、`On Error GoTo` を使ってエラーを「出口(ラベル)」に誘導します。以下のテンプレートをコピーして、自分のコードの標準としてください。
Sub プロフェッショナルな処理の雛形()
‘ — 準備フェーズ —
On Error GoTo ErrorHandler ‘ エラーが発生したらErrorHandlerへジャンプ
‘ ここにメインの処理を書く
Debug.Print ActiveDocument.Paragraphs(1).Range.Text
‘ — 正常終了フェーズ —
GoTo CleanUp ‘ エラーがなければ終了処理へ
ErrorHandler:
‘ — エラー対応フェーズ —
Select Case Err.Number
Case 4605 ‘ よくある「オブジェクトが使用不可」エラー
MsgBox “Wordが現在ビジー状態です。少し待ってから実行してください。”, vbCritical
Case 91 ‘ オブジェクト変数未設定エラー
MsgBox “対象となるオブジェクトが見つかりません。”, vbExclamation
Case Else
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical
End Select
CleanUp:
‘ — 後始末フェーズ —
‘ メモリ解放や画面更新の再開など、必ず実行したい処理をここに書く
Application.ScreenUpdating = True
End Sub
このコードの「魂」:3つのフェーズ
1. エラーハンドラの宣言: `On Error GoTo` で緊急避難場所を指定する。
2. 正常終了の分岐: `GoTo CleanUp` で、エラーハンドラが誤作動しないように正常ルートを切り離す。
3. 後始末(CleanUp): エラーがあろうとなかろうと、最後に必ず実行する処理(画面更新のオンなど)をここに置く。
—
3. 「オブジェクトが削除されました」を防ぐ思考法
Word VBAで最も多いエラーは「対象が存在しない(消去済み)」ことです。これを防ぐには、「操作する前に、そこに本当に存在するか?」を確認する、いわゆる「ガード節」の考え方が重要です。
例えば、選択範囲のテーブルを操作したい場合:
‘ 悪い例:いきなり操作する
Selection.Tables(1).Rows(1).Delete ‘ テーブルが選択されていないと即死する
‘ 良い例:存在を確認してから操作する
If Selection.Information(wdWithInTable) Then
‘ テーブルの中にいる場合のみ実行
Selection.Tables(1).Rows(1).Delete
Else
‘ ユーザーに優しく通知
MsgBox “現在、テーブル内にカーソルがありません。”, vbInformation
End If
このように、「操作の前提条件(IF)」をコードの入り口に書くだけで、エラーの発生率は劇的に下がります。
—
4. 最後に:エンジニアとして成長するために
エラーハンドリングとは、「コードを止めるための仕組み」ではなく、「エラーをコントロールし、ユーザーを迷わせないための優しさ」です。
- 「何が起きたか」を特定し、
- 「どうすれば解決するか」を提示し、
- 「システムを安全に停止させる」。
これさえできれば、あなたの書くVBAは「動くだけのスクリプト」から「業務を支えるアプリケーション」へと昇華します。
まずは既存のコードに `On Error GoTo` を組み込むところから始めてみてください。ここをクリアすれば、あなたはもうVBAの初心者ではありません。次回のステップアップでお会いしましょう!
