こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど自動で動いたぞ!」と感動したのもついで、いざ自分でコードを書こうとすると壁にぶつかる……そんな時期が一番楽しいけれど、一番悩ましいですよね。
今回は、業務でも本当によくある「特定の記号で囲まれた文字を、記号ごと丸ごと一括で消し去りたい!」というテーマを取り上げます。
例えば、アンケート結果や仕様書の中に残ってしまった、こんなテキストたち。
- 「(※後で修正すること)」
- 「【社外秘】」
- 「(要確認)」
これを一つひとつ手作業で探して消していくのは、エンジニアの仕事ではありません。Word VBAの「ワイルドカード検索」という強力な武器を使って、一撃でクレンジングする方法をマスターしましょう。ここをクリアすれば、Word VBAの基本と「文字列操作の本質」がグッと身近になりますよ。
—
1. なぜ「普通の置換」ではダメなのか?
Wordの画面にある「検索と置換(Ctrl + H)」を開いたことがある方なら分かると思いますが、普通の置換では「(」から「)」までの可変の文字列を指定して消すことができません。
「(」と入力して、「)」と入力して……中身が毎回変わるのだから当然ですよね。
ここで登場するのが、ワイルドカード(特殊文字)です。
Wordのワイルドカードは、実はプログラムの「正規表現」によく似た挙動をします。これを使うことで、「任意の文字列」をパターンで捉えることができるようになります。
—
2. 魔法のパターン:「`()`」の正体
今回のキモとなる検索ワードはこれです。
`()` (全角の括弧の場合)
- “(アスタリスク):プログラミングの世界で「任意のゼロ文字以上の連続」を表す超重要キャラです。
- 括弧で挟む:「(」と「)」の間にあるものは何であれ、すべてキャッチしなさい、という意味になります。
つまり、`()` は、「丸括弧で囲まれた中身ごと、すべてをターゲットにする」という強力な呪文なのです。
—
3. 実装コード:一括削除のマクロを書こう
それでは、実際に動かすためのVBAコードを見てみましょう。
以下のコードを、WordのVBAエディタ(Alt + F11 で開けます)の標準モジュールに貼り付けてみてください。
Sub RemoveBracketsAndText()
‘ 画面のちらつきを抑えて高速化するお作法
Application.ScreenUpdating = False
‘ 検索・置換オブジェクトを変数に格納してコードをスマートに
With Selection.Find
‘ 1. 前回の検索条件が残らないように綺麗にリセット
.ClearFormatting
.Replacement.ClearFormatting
‘ 2. 検索する文字列(ワイルドカードを使用)
‘ ※半角括弧なら ( )、隅付き括弧なら 【】 に書き換えてください
.Text = “()”
‘ 3. 置換後の文字列(「何もしない」=空っぽにする)
.Replacement.Text = “”
‘ 4. ワイルドカードを使用するフラグをONにする(超重要!)
.MatchWildcards = True
‘ 5. 文書全体を対象に、一括置換を実行する
.Execute Replace:=wdReplaceAll
End With
‘ 画面描画を元に戻す
Application.ScreenUpdating = True
‘ 完了の合図
MsgBox “括弧で囲まれた文字列の一括削除が完了しました!”, vbInformation
End Sub
コードのここがポイント!
- `Application.ScreenUpdating = False`
プロっぽいエンジニアが必ず書くおまじないです。処理中の画面の書き換えを一時停止することで、マクロの動作スピードが劇的に跳ね上がります。
- `.MatchWildcards = True`
「ワイルドカードを使いますよ」というスイッチです。これを忘れると、`()`という記号そのものを探してしまうので注意してください。
—
4. 初学者が絶対にハマる「3大エラー&落とし穴」
このワイルドカード置換、非常に強力な反面、初心者が必ずと言っていいほどハマるポイントがあります。先に知っておけば怖くありません。
落とし穴①:半角と全角の罠
「コード通りにやったのに、消えません!」という質問の8割がこれです。
プログラム内の `()` は全角の括弧になっています。もし削除したい対象が半角の `(…)` なのであれば、検索ワードも `.Text = “()”` に変更する必要があります。文字の全角・半角はコンピュータにとっては全く別の文字なので注意しましょう。
落とし穴②:予期せぬ長距離マッチ(貪欲な検索)
もし文書内に以下のような文章があったらどうなるでしょうか?
> 「本日は晴天なり(午後は雨の予報です)、傘をお忘れなく。」
もし、文書の途中に別の括弧がなく、これが「一つの段落内」や「大きな範囲」として解釈された場合、Wordのワイルドカードは「最初の `(` から、最後の `)」まで」を一つの塊として捉えてしまうことがあります。
今回は初学者向けにシンプルに紹介していますが、もし「文をまたいで消えてしまった!」という場合は、検索パターンを `.Text = “([!)]@)”` (括弧の中に閉じ括弧を含まない)といった少し高度な表現にする必要が出てきます。まずはシンプルな文書テストから始めてみてください。
落とし穴③:Selection(選択範囲)に頼りすぎない
今回はコードの分かりやすさを優先して `Selection.Find` を使いましたが、実務の現場では画面上のカーソル位置に依存しない `ActiveDocument.Content.Find` のように、文書オブジェクトを直接叩く書き方がプロの主流です。慣れてきたら「カーソルを選ばずに背後で一瞬で処理する書き方」にも挑戦してみましょう。
—
おわりに
お疲れ様でした!
今回学んだ `Find` オブジェクトとワイルドカードの組み合わせは、Word VBAの自動化において最強のスキルの一つです。これが使えるようになると、毎日何時間もかけて手作業でやっていた文字のクリーニングが、わずか0.1秒で終わるようになります。
「ここをこう変えたらどうなるだろう?」という好奇心を大切に、ぜひご自身の業務データで試してみてくださいね。
あなたのWord VBAライフが、より快適でクリエイティブなものになりますように!
