【入門編】【初心者向け】ワイルドカード検索で「特定の記号で囲まれた文字列」を抽出して別ファイルに保存する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押すだけのステージから一歩進んで、「自分の手で自由自在に文書を操りたい」と思っているあなたへ。

今回は、業務効率化の現場でめちゃくちゃ重宝する「ワイルドカードを使った文字列の抽出と、別ファイルへの保存」をテーマにお届けします。

「特定の記号(例えば、全角の【 】や「 」など)で囲まれた重要情報だけを抜き出して、別のファイルにまとめたい」——そんな作業、手作業でやっていたら目がチカチカしてミス続出ですよね。これをVBAの`Find`(検索)機能とワイルドカードを使って、一瞬で片付ける方法を伝授します。

ここをクリアすれば、Word VBAにおける「検索と置換」の本質はバッチリ掴めますよ。さあ、一緒に扉を開けましょう!

—

1. なぜ「ワイルドカード検索」なのか?

Wordの検索機能には、Excelの「あいまい検索」のような強力な武器があります。それが「ワイルドカード」です。

例えば、`【任意の文字列】` というパターンを検索したいとき、普通の検索では「【」と「】」の間に何が入っているか分からないのでお手上げになりますよね。
しかし、ワイルドカードを使えば「『【』から『】』までの間に、どんな文字が入っていてもいいから全部捕まえろ!」という命令が可能になります。

ワイルドカードの基本記号(今回使う主役たち)

  • “ (アスタリスク): 0文字以上の任意の文字列にマッチします。
  • `[ ]` (角括弧): 角括弧の中にある「いずれか1文字」にマッチします。

これらを組み合わせることで、目当てのターゲットを正確にスナイパーのように撃ち抜くことができるのです。

—

2. 現場で使える!「記号で囲まれた文字列の抽出」完全コード

百聞は一見に如かず。まずは、現在開いているWord文書から「【 】」で囲まれた文字列をすべて探し出し、新しいWord文書に書き出して保存するコードの全貌をご覧ください。

VBAエディタ(`Alt + F11`)を開き、標準モジュールにペーストして実行してみてください。

Sub ExtractBracketedText()
Dim rngTarget As Range
Dim docNew As Document
Dim i As Long

‘ 1. 検索対象のレンジ(文書全体)を取得
Set rngTarget = ActiveDocument.Content

‘ 2. 抽出結果を書き込むための新しいドキュメントを作成
Set docNew = Documents.Add

‘ 3. 検索条件の設定(Findオブジェクトの真骨頂)
With rngTarget.Find
.ClearFormatting
.Replacement.ClearFormatting

‘ 検索文字列の設定:【 から 】まで(ワイルドカード使用)
‘ 【】だと最短マッチではなく最長マッチになる点に注意
.Text = “【】”
.MatchWildcards = True
.Forward = True
.Wrap = wdFindStop

‘ 4. 該当するものをループ処理ですべて見つける
Do While .Execute
‘ 見つかった文字列を新しいドキュメントに転記(改行付き)
docNew.Content.InsertAfter rngTarget.Text & vbCrLf

i = i + 1

‘ 次の検索のためにレンジの末尾を更新(無限ループ防止のキモ)
rngTarget.Collapse wdCollapseEnd
Loop
End With

‘ 5. 結果の通知と保存処理
If i > 0 Then
MsgBox i & “件のデータを抽出しました!”, vbInformation, “処理完了”

‘ 必要に応じてここで名前を付けて保存できます
‘ docNew.SaveAs2 “C:\YourPath\ExtractedData.docx”
Else
‘ 何も見つからなかった場合は新しいドキュメントを閉じる
docNew.Close SaveChanges:=False
MsgBox “条件に合致する文字列は見つかりませんでした。”, vbExclamation, “お知らせ”
End If

End Sub

—

3. コードの急所を徹底解説!

このコードには、Word VBAの検索機能を使う上で絶対に外せない「プロの技」が詰まっています。初心者の方がつまずきやすいポイントを噛み砕いて解説しますね。

① `.MatchWildcards = True` の魔法

これが今回のキモです。これを `True` に設定することで、Wordに対して「今からワイルドカードを使うから気合を入れてくれ」と伝えています。これを忘れると、`【】` という文字そのものを探してしまうので注意してください。

② 無限ループを防ぐ `rngTarget.Collapse wdCollapseEnd`

ここが一番重要です。
Wordの `Find` は、一度文字を見つけると、その「見つかった場所」でレンジ(範囲)が止まります。もし次の行の処理を書かないと、プログラムが最初のヒット地点で永遠に同じ文字を探し続ける「無限地獄(フリーズ)」に陥ります。

`rngTarget.Collapse wdCollapseEnd` は、「今見つかった言葉の『お尻』にカーソルを移動させ、そこからまた先に向かって検索を再開しなさい」という、エンジニアの優しさ(命綱)なのです。

③ 「最短マッチ」の罠を知る

今回の検索ワードには `【】` を使いました。これは「【」で始まって「】」で終わる文字列すべてを捉えます。
もし文書内に `【りんご】を買って、【みかん】を食べた` という文章があった場合、“ は貪欲(最長マッチ)に働くため、文中に複数の括弧があっても意図通りに動かないケースがあります。
「特定の文字を含まない」というワイルドカード(例:`【[!】]】` など)を使いこなせるようになると、さらに精度が上がりますが、まずは基本の `【】` でしっかり動作を確認してみましょう。

—

4. 初心者がハマる「よくあるエラー」と対策

最後に、このコードを自分の環境で動かしたときに直面しがちなトラブルシューティングを共有しておきます。

  • エラー:「コンパイル エラー: ユーザー定義型が定義されていません」
  • → 原因:`Document` や `Range` などのオブジェクト型を正しく認識できていません。WordのVBAエディタで書いているか確認してください(ExcelのVBAモジュールにコピペするとこのエラーが出ます)。
  • 何もヒットしないのにエラーも出ない
  • → 原因:全角・半角の違いです。コード内の `【` や `】` が、実際の文書内の記号と一致しているか(半角の `[` と `]` になっていないか)を確認してください。

—

おわりに

お疲れ様でした!
今回マスターした `Find` オブジェクトとワイルドカードの組み合わせは、Word自動化の底力を引き出す最高のスパイスです。

「記号で囲まれたデータ抽出」ができるようになると、議事録からのタスク抽出、アンケート結果の回収、仕様書からのキーワード抜き出しなど、あらゆる事務作業を自動化する基礎体力が身につきます。

「ここをこう変えたら、別の記号も抽出できるかな?」と、ぜひご自身の環境でコードをいじって遊んでみてください。その試行錯誤こそが、あなたを本物のエンジニアへと引き上げる最高の原動力になりますよ。

それでは、快適なWord VBAライフを!

タイトルとURLをコピーしました