Word VBAを掌握する極限の知見:括弧ごとテキストを一網打尽にするワイルドカード検索の極意
業務自動化エンジニアの私のもとに、よくこんな相談が寄せられる。
「Word書類の中にある『【〇〇】』のような特定の括弧と、その中身の文字列を丸ごと一括削除したいのですが、手作業で消すか、泥臭いループを回すしかありませんか?」
断言しよう。ループを回すなど論外だ。Wordの `Find` オブジェクトと、その真骨頂である「ワイルドカード検索」を正しく使えば、巨大な仕様書であっても一瞬で、かつバグなくクレンジングできる。
今回は、初心者から一歩抜け出し、実務で即戦力となる「堅牢な括弧ごと削除ロジック」の設計思想と実装コードを伝授しよう。
—
なぜ「通常の置換」や「泥臭いループ」では失敗するのか?
初心者がやりがちなアプローチは、`For Each` で段落を走査し、文字列関数をゴリゴリ書く方法だ。しかし、これには明確な致命傷がある。
1. パフォーマンスの絶望的な低下:WordのDOM(Document Object Model)をVBAから細かく叩くのは、極めてコストが重い。ページ数が多い文書ではフリーズを疑うレベルで遅くなる。
2. 改行をまたぐ検索への無力:文字列関数では、括弧の開始と終了が異なる段落にまたがった瞬間にお手上げになる。
3. メンテナンス性の欠如:括弧の種類が変わるたびにコードを書き直す羽目になる。
Wordの検索・置換エンジンは、裏でC++のネイティブな高速処理が走っている。VBAから使うべきは、このエンジンをダイレクトに叩く `Range.Find` だ。そして、複数文字や任意の文字列をキャプチャするために不可欠なのが、Word版の正規表現である「ワイルドカード」である。
—
実務で通用する堅牢な設計要件
プロダクション環境(実際の業務)でVBAを動かす場合、以下の要件を満たしていなければならない。
- 画面描画の抑制(ScreenUpdating):処理中のチラつきを消し、実行速度を極限まで引き上げる。
- 検索条件の完全な初期化(ClearFormatting / ClearAllFwd):WordのFindは「前回実行時の条件」をメモリに保持する厄介な性質がある。これをクリアしないと、環境によって動いたり動かなかったりする「不具合の温床」になる。
- エラーハンドリング:対象が存在しない場合でも、静かに処理を終了させる。
—
コピペで使えるプロダクションコード
以下のコードは、文書内の『【』から『】』までの文字列(括弧自体を含む)を検出し、空白に置換(=削除)するプロシージャだ。隅々までコメントを入れたので、設計意図を読み取りながら活用してほしい。
Option Explicit
Sub RemoveBracketsAndContent()
‘ =========================================================================
‘ 処理名: 【 括弧ごと一括削除ツール 】
‘ 概要 : ワイルドカード検索を駆使し、【 】で囲まれた領域を高速に消去する
‘ =========================================================================
Dim targetRange As Range
Set targetRange = ActiveDocument.Content
‘ 1. パフォーマンス最適化と画面描画のロック
With Application
.ScreenUpdating = False
.DisplayAlerts = wdAlertsNone
End With
On Error GoTo ErrorHandler
‘ 2. 検索条件の完全初期化(※極めて重要:前回のゴミ設定を残さない)
targetRange.Find.ClearFormatting
targetRange.Find.Replacement.ClearFormatting
‘ 3. ワイルドカード検索と置換の設定
With targetRange.Find
‘ 検索パターン: 「【」から「】」までの任意の文字列(最小マッチ)
‘ ※Wordのワイルドカードでは「」は何文字でもマッチする
.Text = “【】”
‘ 置換後の文字列(完全削除=空文字)
.Replacement.Text = “”
‘ 各種パラメータの設定
.Forward = True
.Wrap = wdFindStop ‘ 文書の最後まで来たら終了
.Format = False
.MatchCase = True ‘ 大文字小文字を区別(日本語では影響薄いが明示的に)
.MatchWholeWord = False
.MatchWildcards = True ‘ ★ワイルドカードを使用する
.MatchSoundsLike = False
.MatchAllWordForms = False
‘ 4. 一括置換の実行
.Execute Replace:=wdReplaceAll
End With
‘ 正常終了時の処理
MsgBox “括弧ごとの一括削除が完了しました。”, vbInformation, “処理成功”
ErrorHandler:
If Err.Number <> 0 Then
MsgBox “予期せぬエラーが発生しました: ” & Err.Description, vbCritical, “エラー”
End If
‘ 5. 画面描画の確実な復元(エラー時も必ず通す)
With Application
.ScreenUpdating = True
.DisplayAlerts = wdAlertsAll
End With
End Sub
—
チーフアーキテクトからの実践アドバイス:ワイルドカードの罠
このコードの肝は `.Text = “【】”` という検索パターンだ。ここでエンジニアとして知っておくべき極意を一つ。
Wordのワイルドカードにおける “ は、「最長一致(Greedy Match)」で動作する。
例えば、文書内に `【条件A】は〇〇であり、【条件B】は××である。` という一文があった場合、
`【】` と指定すると、最初の `【` から最後の `】` まで(つまり文全体)を一つの塊として捉えてしまうリスクがある。
もし文書内にネストした括弧や、複数の括弧が同一行に連続している場合で、意図せぬ範囲まで消えてしまう場合は、ワイルドカードの否定表現(例:`【[!】]】` = 途中に「】」を含まない括弧内を検索する)を駆使する必要がある。
今回のテーマである「特定の括弧を一網打尽にする」という目的においては、まずは上記の基本形(`【】`)で9割の業務要件はクリアできるはずだ。
業務自動化の本質は、「正確性・速度・保守性」の三位一体にある。
ぜひこのコードをあなたの武器とし、退屈な手作業から現場を解放してほしい。
