こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いた!」という感動を味わった次は、「狙ったところだけをスマートに自動化したい」という壁にぶつかる頃ですよね。
今回は、実務で本当によくある「段落のスタイル(見た目や設定)を一切壊さず、特定のキーワードだけを鮮やかに色づけする」というテーマについて、プロの現場でも通用する極意を伝授します。
ここをクリアすれば、Word VBAのオブジェクト操作の「本質」が見えてきますよ。肩の力を抜いて、一緒にステップアップしていきましょう!
—
なぜ「文字の色を変えるだけ」で苦戦するのか?
Wordで文字の色を変えたいと思ったとき、初心者の方が真っ先に思いつくのは次のようなコードかもしれません。
‘ 【やってはいけないアンチパターン例】
Selection.Find.Text = “重要”
Selection.Font.Color = RGB(255, 0, 0)
これ、一見すると動きそうですが、実務のドキュメントで実行すると大惨事を引き起こします。
なぜなら、`Selection` やドキュメント全体を力技で書き換えると、その段落に設定されていた「見出しスタイル」や「行間・インデント」といった大切な段落書式がリセットされたり、崩れたりするリスクがあるからです。
プログラミングの鉄則は「触るべき最小限のオブジェクトだけを正確に狙うこと」。
Word VBAには、この「書式を維持したまま文字を置換・装飾する」ための専用の特効薬が用意されています。それが `Find` オブジェクトの書式検索機能 です。
—
解決の鍵:Findオブジェクトに「条件」を教え込む
Wordの「検索と置換」ダイアログを思い出してください。あの画面では、「特定の文字を探しつつ、フォントやスタイルを指定して絞り込む」ことができますよね。
あれをVBAで完全に再現するのが今回のアプローチです。
ロジックの流れはこうです:
1. 文書の頭からお尻まで(あるいは選択範囲内を)スキャンする。
2. 探したいキーワード(例:「重要」)を指定する。
3. 「段落スタイルそのものには一切触れず、ヒットした文字列の『フォントの色』だけを上書きする」。
これなら、ベースとなる段落の美しさは1ミリも損なわれません。
—
実践!コピペで使えるスマート・ハイライト・マクロ
それでは、実際のコードを見てみましょう。
今回は、ドキュメント全体から「重要」というキーワードを探し出し、段落スタイルを壊さずに鮮やかな赤色に変更するプロシージャをご用意しました。
開発タブのVBE(Visual Basic Editor)を開き、標準モジュールに貼り付けてみてください。
Sub HighlightKeywordSafely()
Dim rngTarget As Range
‘ 1. 対象とする範囲をドキュメント全体に設定します
Set rngTarget = ActiveDocument.Content
‘ 2. Findオブジェクトの初期化(前回のゴミ設定が残らないようにクリア)
rngTarget.Find.ClearFormatting
rngTarget.Find.Replacement.ClearFormatting
‘ 3. 検索条件と置換条件の設定
With rngTarget.Find
.Text = “重要” ‘ 探したいキーワード
.Replacement.Font.Color = wdColorRed ‘ 変更後のフォント色(赤)
.Forward = True ‘ 文書の先頭から末尾へ向かって検索
.Wrap = wdFindStop ‘ 文書の最後まで来たら検索をストップ
.MatchCase = False ‘ 大文字・小文字を区別しない
.MatchWholeWord = False ‘ 単語の一部でもヒットさせる
End With
‘ 4. 一括置換の実行(Replace:=wdReplaceAll で該当箇所をすべて処理)
rngTarget.Find.Execute Replace:=wdReplaceAll
‘ 5. 後片付け
Set rngTarget = Nothing
MsgBox “キーワードのハイライトが完了しました!”, vbInformation, “処理成功”
End Sub
コードのここがポイント!
- `ClearFormatting` の重要性
これが今回の最も重要なポイントです。これを記述しておかないと、「前回マクロを実行したときのゴミ書式」が `Find` オブジェクトに残ってしまい、予期せぬエラーや誤動作の原因になります。プログラミングの基本は「きれいな状態から始めること」です。
- `Replacement.Font.Color` のみを指定
段落(Paragraph)や文字(Font)全体のプロパティをごっそり書き換えるのではなく、`Replacement`(置換後)の「フォントの色」ピンポイントだけを指定しているため、元の段落スタイルは完全に保護されます。
—
陥りやすいエラーと、知っておくべき「沼」
Word VBAを書き始めると、誰もが一度は次のような壁にぶつかります。知っておくだけで数時間のデバッグ時間を節約できますよ。
1. 「文字色が変わらない……」と思ったら
検索ワードはヒットしているのに色が変わらない場合、たいていは `ClearFormatting` が抜けている か、ドキュメント内の文字にすでに「直接フォント色」がハードコーディングされているケースです。Wordの仕様上、直接色がついている部分は置換が効きにくいことがあります。一度「標準」スタイルに戻してから試してみてください。
2. ループ処理(Do While)を書きたくなる罠
「複数あるキーワードを個別に処理したい」と思ったとき、`Do While .Execute` のようなループを書きたくなりますよね。
もちろん複雑な条件分岐が必要な場合はループが必要ですが、今回のような「単一のキーワードを一括で色づけする」ケースであれば、おとなしく `Replace:=wdReplaceAll` を使うのがパフォーマンス面でも圧倒的に高速で、コードもシンプルになります。WordのC++層で処理が完結するため、VBAのループ特有の「画面がチラつく重い現象」を防げます。
—
まとめ:小さな「丁寧さ」がプロのコードを作る
今回は、段落スタイルを死守しながら特定の文字列だけを美しく装飾するテクニックをご紹介しました。
- スタイルとフォントのレイヤーを混同しないこと
- Findオブジェクトを使うときは必ず `ClearFormatting` を挟むこと
この2つを意識するだけで、あなたが書くマクロの品質は、素人の域を脱し、プロのエンジニアが書くような堅牢な自動化ツールへと生まれ変わります。
「ここをこう変えたらどうなるだろう?」という好奇心を大切に、ぜひご自身の業務データで試してみてくださいね。あなたのWord VBAライフが、より快適でクリエイティブなものになりますように!
