【入門編】【中級者向け】段落の「スタイル」を維持したまま、特定のキーワードを含む段落のフォント色だけを条件付きで変更する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いたぞ!」と感動したのも束の間、いざ自分でコードを書こうとすると、思い通りにいかなくて頭を抱えていませんか?

「特定のキーワードが入っている段落だけ、文字の色を変えたい」
そう思ってネットで調べると、`.Style = “見出し 1″` のようなスタイル一括変更や、段落全体の書式を書き換えるコードばかりが出てきて、「せっかく綺麗に整えていた段落スタイルが崩れてしまう……」と絶望した経験はありませんか?

大丈夫。今回は、Word VBAの心臓部である「オブジェクトの階層構造」「文字装飾の優先順位」の仕組みを紐解きながら、スタイルを一切破壊せずに、特定のキーワードを含む段落だけをピンポイントで美しく染め上げる実務的なテクニックを伝授します。

ここをクリアすれば、Word VBAの基本はバッチリですよ!さあ、一緒に扉を開けましょう。

なぜ「スタイル」が上書きされてしまうのか?(Word VBAの基本構造)

まず、Wordの文書構造を正しく理解しましょう。Wordの文書は、以下のようなマトリョーシカのような入れ子構造(オブジェクトモデル)になっています。

`Document`(文書) > `Paragraphs`(段落たち) > `Paragraph`(1つの段落) > `Range`(文字の範囲) > `Font`(フォント)

多くの初心者がやりがちな失敗は、段落(Paragraph)そのものに対して `.Font.Color` を直接指定してしまうことです。段落全体に直接色を塗ってしまうと、Wordはその段落に紐づいていた「スタイル(見出しや標準といった定義)」の呪縛を無視し、強制的な「直接書式(ローカル書式)」で上書きしてしまいます。これでは、後からスタイルの一括変更が効かなくなる「負債コード」になってしまいます。

プロの選択:段落の「中身」だけを賢く狙い撃つ

スタイルを維持したまま文字色を変えるための鉄則、それは「段落全体ではなく、キーワードが含まれる特定の範囲(Range)のフォント色だけを書き換える」ということです。

Word VBAには、文書の中から特定の文字列を探し出す `Find` オブジェクトという強力な機能があります。これと段落のループを組み合わせることで、「スタイルを保持したまま、条件付きで色を変える」というプロの技が完成します。

実践!スタイルを死守してフォント色を変えるマクロ

それでは、実際の現場で即戦力として使えるコードを公開します。
以下のコードをWordのVBAエディタ(Alt + F11で起動)の標準モジュールに貼り付けてください。

Sub HighlightKeywordParagraphs()
‘ =====================================================================
‘ テーマ: スタイルを維持したまま、特定キーワードを含む段落のフォント色を変更する
‘ 執筆者: チーフアーキテクト
‘ =====================================================================

Dim targetPara As Paragraph
Dim targetKeyword As String
Dim searchRange As Range

‘ 1. 検索したいキーワードを設定(例: “【重要】”)
targetKeyword = “【重要】”

‘ 2. 処理速度を爆発的に向上させるため、画面描画を一時停止
Application.ScreenUpdating = False

‘ 3. 文書内のすべての段落を先頭から順番にスキャン
For Each targetPara In ActiveDocument.Paragraphs

‘ 段落の文字列の中に、目的のキーワードが含まれているか判定
‘ (InStr関数は「文字列が含まれている位置」を返します。0より大きければ存在します)
If InStr(targetPara.Range.Text, targetKeyword) > 0 Then

‘ 【重要】段落のスタイルを変更するのではなく、
‘ 段落内の「テキスト範囲(Range)」のフォントオブジェクトに直接アプローチする
Set searchRange = targetPara.Range

With searchRange.Find
.Text = targetKeyword
.Forward = True
.Wrap = wdFindStop

‘ キーワードが見つかった場合のみ、その部分のフォント色を「赤」に変更
‘ ※スタイル自体の定義は書き換わらないため、安全です!
Do While .Execute
searchRange.Font.Color = wdColorRed

‘ 太字にしたい場合は以下のコメントアウトを外してください
‘ searchRange.Font.Bold = True

‘ 次の同一段落内の検索へ(無限ループ防止)
.Collapse wdCollapseEnd
Loop
End With

End If

Next targetPara

‘ 4. 画面描画を復元
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “処理が完了しました!スタイルを崩さずにキーワードを装飾しました。”, vbInformation, “自動化完了”
End Sub

コードの注目ポイント(知的な先輩からの解説)

このコードには、実務で絶対に知っておくべき「プロのこだわり」が詰まっています。

1. `Application.ScreenUpdating = False` の魔法

Word VBAで `For Each` を使って段落を1つずつ舐めていく処理は、ページ数が多い文書だと画面がチカチカパチパチと点滅し、処理速度も著しく低下します。処理の最初に画面描画をストップさせ、最後に一瞬で描き戻すこのテクニックは、業務自動化の基本中の基本です。

2. スタイルを破壊しない `.Font.Color` の使いどころ

`targetPara.Style = …` のような記述を一切排除しています。あくまで「段落の中にある特定の文字列(Range)のプロパティ」を書き換えているため、段落に割り当てられている「見出しスタイル」のフォントサイズや行間といった基本情報は1ミリも損なわれません。これが今回最も伝えたかった「本質」です。

3. `wdFindStop` と `.Collapse` の安全装置

Wordの検索機能(Find)は、設定を怠ると文書の最後まで検索した後に「文書の先頭から再検索しますか?」という余計なダイアログを出してプログラムをフリーズさせます。`wdFindStop` を指定し、見つかったら範囲を縮小(Collapse)させることで、安全かつ確実なループを実現しています。

陥りやすいエラーと対策

初心者がこのコードをカスタマイズする際によくハマる罠をいくつかご紹介します。

  • エラー:「オブジェクト変数または With ブロック変数が見つかりません。」
  • 原因: `Set searchRange = targetPara.Range` の `Set` を忘れている可能性が高いです。オブジェクトを代入するときは必ず `Set` が必要です(基本かつ最大の罠!)。
  • 現象:キーワードだけでなく、段落全体の色が変わってしまう
  • 原因: `searchRange.Font.Color` ではなく、うっかり `targetPara.Range.Font.Color` としていませんか? `targetPara.Range` にしてしまうと、段落全体の文字列が対象になってしまいます。キーワードだけをピンポイントで撃ち抜くために、`Find` オブジェクトが捉えた `searchRange` を使うことがポイントです。

おわりに

お疲れ様でした!
今回は「スタイルを維持したまま特定のキーワードだけを装飾する」という、一見難しそうに見えて実は論理的なアプローチが必要なテーマを解説しました。

Word VBAは、オブジェクトの「スコープ(どこを操作しているか)」を正しく意識できるようになると、途端に自由自在に操れる楽しいオモチャ(そして最強の相棒)に変わります。

「ここをこう変えたらどうなるだろう?」という好奇心を大切に、日々の業務をガンガン自動化していってくださいね。あなたのVBAライフが素晴らしいものになるよう、応援しています!

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