Word VBAを掌握する:検索で見つからない時の「安全な停止」こそが、真の自動化への第一歩
こんにちは。自動化の世界へようこそ。
「マクロの記録」ボタンを押してコードを眺め、少しずつ自分で書き換え始めたあなた。今、あなたは「プログラムが期待通りに動かない」という最初の壁に直面しているかもしれません。
特に、Wordの強力な機能である「検索(Find)」は、初心者が最も陥りやすい落とし穴を持っています。それは、「見つからなかったときに、プログラムが路頭に迷う」という現象です。
今日は、あなたのコードを「ただ動くもの」から「現場で信頼される堅牢なツール」へと進化させるための、極めて重要な技術をお伝えします。
—
なぜ「検索」はエラーを引き起こすのか?
Word VBAで `Find.Execute` を実行したとき、コンピュータは律儀に探します。しかし、対象の文字列が存在しなかった場合、Wordは「見つかりませんでした」という結果を `Found` というプロパティに格納します。
初心者の多くは、この結果を確認せずに次の処理を進めようとします。その結果、存在しないものを操作しようとして、マクロが強制終了するのです。
「Find.Found」こそが守護神
`Find.Found` は、検索の成否を教えてくれる真実のフラグです。これを確認する習慣をつけるだけで、あなたのコードの安定感は劇的に向上します。
—
安全な設計:検索失敗時に「優しく止める」コード
では、実際に現場で使える「安全な検索テンプレート」を見てみましょう。このパターンを一つ覚えておくだけで、大抵の文字列操作は怖くなくなります。
Sub SafeFindExample()
Dim rng As Range
Set rng = ActiveDocument.Content ‘ 文書全体を範囲として指定
‘ 検索条件の設定
With rng.Find
.ClearFormatting ‘ 前回の検索設定をリセット(重要!)
.Text = “探したい文字列” ‘ 検索対象
.Forward = True ‘ 前方に向かって検索
.Wrap = wdFindStop ‘ 文末で検索を終了する(ループ防止)
‘ 【重要】ここで検索を実行し、結果を判定する
If .Execute = True Then
‘ 見つかった場合の処理
MsgBox “見つかりました!操作を続行します。”, vbInformation
rng.Select ‘ 該当箇所を選択状態にするなど
Else
‘ 見つからなかった場合の「安全な終了」
MsgBox “対象の文字列は見つかりませんでした。処理を中断します。”, vbExclamation
Exit Sub ‘ ここでマクロを安全に終了させる
End If
End With
End Sub
このコードの「賢いポイント」
1. `.ClearFormatting` を必ず入れる:
以前の検索条件(太字やフォント指定など)が残っていると、意図しない挙動になります。常にクリーンな状態で始めるのがプロの流儀です。
2. `Exit Sub` で即時離脱:
`If`文で失敗を検知したら、その場でマクロを終わらせます。「何もしない」という選択肢は、バグを防ぐ最強の手段です。
3. `.Wrap = wdFindStop`:
これを設定しないと、検索が文書の末尾に達した瞬間に先頭へ戻り、永遠に検索を繰り返す「無限ループ」に陥るリスクがあります。
—
陥りやすい「罠」:なぜエラーになるのか?
初心者のコードでよく見かけるのが、「見つかった前提で処理を書く」ことです。
- 罠1:検索結果を判定せずに次の行を実行する
→ 存在しない `Range` オブジェクトを操作しようとして、実行時エラーが発生します。
- 罠2:`.Wrap` の設定を忘れる
→ プログラムが文書内を延々と探し続け、Wordが応答なし(フリーズ)状態になります。
これらは、`If .Execute = True Then` というゲートを設けるだけで、魔法のように解決します。
—
次のステップ:正規表現への招待
ここまでの基本ができれば、あなたはもう初心者ではありません。
さらに高度な自動化を目指すなら、正規表現(Regular Expressions)の活用をお勧めします。
`Find.Text` では「特定の文字列」しか探せませんが、正規表現を使えば「数字3桁で始まる文字列」や「メールアドレスの形式」といった、曖昧なルールを持つ文字列を自由自在に抽出・置換できるようになります。
まずは、今回紹介した「見つからなかったら優しく止める」という作法を、あなたの日常業務のコードに取り入れてみてください。
—
最後に:エンジニアとして大切なこと
「完璧なコード」を書こうとしてはいけません。「失敗したときに、どう振る舞うかを定義できるコード」こそが、本当に価値のあるコードです。
今日学んだこの「安全装置(ガード)」は、あなたが今後どんな複雑なシステムを組むことになっても、必ず役に立つはずです。
ここをクリアしたあなたなら、次は正規表現の世界もきっと楽勝ですよ。また次のステップでお会いしましょう!
