Word VBAの真髄:ハードコーディングを卒業し、「動的検索・置換ツール」を構築する
こんにちは。業務自動化の世界へようこそ。
「マクロの記録」ボタンを押して生成される、あの長くて冗長なコードに辟易していませんか?
Word VBAをマスターする第一歩は、「固定値(ハードコーディング)」からの脱却です。今日は、あなたが実行時に検索したい文字を自由に入れられる、プロ仕様の「動的検索・置換ツール」を一緒に作っていきましょう。ここをクリアすれば、あなたのWord自動化スキルは格段にレベルアップします。
—
1. なぜ「ハードコーディング」を避けるべきなのか?
VBAを始めたばかりの人が書きがちなのが、これです。
‘ 悪い例:これだと「旧製品名」を「新製品名」に変えるしかできない
Selection.Find.Text = “旧製品名”
Selection.Find.Replacement.Text = “新製品名”
これでは、新しい案件が来るたびにコードを書き換える必要があります。エンジニアの仕事は「仕組みを作ること」であって、「使い捨てのコードを量産すること」ではありません。「何を探し、何に変えるか」を、実行する瞬間にユーザーから受け取る。 これが自動化の鉄則です。
—
2. 汎用ツール構築の設計図
今回は「InputBox(入力ボックス)」という機能を使います。これは、プログラムの実行中に小さなウィンドウを表示して、ユーザーから直接値を受け取るための窓口です。
構築の手順
1. InputBoxで値を拾う:検索する文字と、置換後の文字を聞く。
2. Findオブジェクトを初期化する:余計な設定が残っていると誤作動するため、まずはクリアする。
3. 検索・置換を実行する:Wordの強力な `Find` 機能に指示を出す。
—
3. 実装コード:魂を込めた汎用置換ツール
以下のコードをVBAエディタ(Alt + F11)の標準モジュールに貼り付けてください。
Sub DynamicSearchAndReplace()
Dim findText As String
Dim replaceText As String
‘ 1. ユーザーから値を取得(キャンセルされたら終了)
findText = InputBox(“検索する文字列を入力してください:”, “検索の指定”)
If findText = “” Then Exit Sub
replaceText = InputBox(“置換後の文字列を入力してください:”, “置換の指定”)
‘ 2. Wordの検索機能を初期化(ここがプロのこだわりです)
‘ 前回の検索設定が残っているとバグの元になるため、一旦クリアします
With Selection.Find
.ClearFormatting
.Replacement.ClearFormatting
‘ 3. 検索設定の定義
.Text = findText
.Replacement.Text = replaceText
.Forward = True ‘ 文書の後方に向かって検索
.Wrap = wdFindContinue ‘ 文末まで行ったら先頭に戻る
.Format = False ‘ 書式は無視(文字のみ置換)
.MatchCase = False ‘ 大文字小文字を区別しない
.MatchWholeWord = False ‘ 単語の一部でもヒットさせる
‘ 4. 一括置換を実行
.Execute Replace:=wdReplaceAll
End With
MsgBox “置換が完了しました。”, vbInformation
End Sub
—
4. コードの深掘り解説:ここが「プロの勘所」
初心者がよくハマるポイントを、私の経験から解説します。
- `.ClearFormatting` の重要性:
以前の検索で「太字の文字だけ検索」といった設定をしたままだと、後で別の検索をする時に「なぜかヒットしない!」という事態になります。検索を開始する前に、「設定を真っ白にする」のが鉄則です。
- `.Wrap = wdFindContinue`:
これがないと、カーソル位置より後ろしか検索してくれません。`wdFindContinue` を指定することで、文書全体を漏れなくスキャンできます。
- エラーハンドリング:
`If findText = “” Then Exit Sub` の部分です。入力ボックスで「キャンセル」を押された場合、空文字が返ってきます。そのまま進むと空文字を置換しようとして無駄な処理が走るため、ここで安全に終了させるのが大人の流儀です。
—
5. 次のステップへ:正規表現への挑戦
このツールが動くようになったら、あなたはもう「マクロの記録」卒業生です。
次は、さらに高度な「正規表現(Regular Expressions)」を学びましょう。
「特定の数字の羅列を探したい」「メールアドレスの形式だけ抜き出したい」といった複雑な検索は、通常の `Find` では限界があります。VBAで `VBScript.RegExp` オブジェクトを呼び出せば、検索の自由度は無限大に広がります。
まずは今回作成したコードを動かし、自分の手で「自動化の魔法」を体感してください。コードは裏切りません。正しく設計すれば、あなたの代わりに何度でも、正確に働いてくれます。
もし詰まったら、いつでも戻ってきてください。私たちは常に、より賢い自動化を目指しています。頑張ってくださいね!
