【入門編】【初心者向け】Rangeオブジェクトで特定の段落だけをピンポイントで太字にする基本操作 – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して、画面がガチャガチャと切り替わる自動生成コードにゲンナリしていませんか?「あれ、動くけど何をやっているのかサッパリ分からない……」と悩むのは、誰もが通る最初の関門です。

今回は、プログラミング初学者や「マクロの記録」から一歩抜け出したいあなたに向けて、Word VBAの真髄である「Range(レンジ)オブジェクト」を使った、エレガントで爆速な段落装飾のテクニックを伝授します。

ここをクリアすれば、Word VBAの基本構造はバッチリです!優しく紐解いていくので、肩の力を抜いてついてきてくださいね。

なぜ「Selection(選択)」ではなく「Range(範囲)」なのか?

Word VBAを学び始めると、真っ先に目にするのが `Selection` という言葉です。これは、画面上で「今カーソルが点滅している場所」や「マウスで青く選択している領域」を指します。

一見、直感的で分かりやすいのですが、実はこれ、業務自動化(プログラミング)の世界ではご法度とされています。

  • Selectionの欠点:
  • 画面の描画を伴うため、処理が極めて遅い
  • 処理のたびに画面がチラつき、ユーザーが操作を邪魔される。
  • 余計なオブジェクトを触ってしまい、予期せぬエラーの温床になる。

一方、今回主役にする `Range` オブジェクト は、いわば「見えない下敷き」です。画面を一切書き換えず、メモリ(裏側)の空間だけで文字の抽出や装飾を行います。だから速い、安全、そしてスマートなのです。

今回のミッション:特定のキーワードを含む段落を「太字」にする

イメージしてください。何百ページもある仕様書やレポートの中で、「【要確認】」という言葉が入っている段落だけを、一瞬で太字にしたいとします。

これを人の手でやったら目がチカチカしますが、VBAなら一瞬です。
以下のコードを、あなたのWordのVBAエディタ(Alt + F11で開けます)に貼り付けてみてください。

実用VBAコード

Sub HighlightSpecificParagraphs()
Dim targetDoc As Document
Dim p As Paragraph
Dim keyword As String

‘ 処理対象のドキュメントをアクティブな文書に設定
Set targetDoc = ActiveDocument

‘ 探したいキーワードを定義
keyword = “【要確認】”

‘ 文書内のすべての段落を上から順にスキャンする
For Each p In targetDoc.Paragraphs

‘ 段落の文字列の中にキーワードが含まれているかチェック
‘ ※ InStr関数は、文字が見つかった位置を返します(0なら見つかっていない)
If InStr(p.Range.Text, keyword) > 0 Then

‘ 【ここが本質】Selectionを使わず、段落のRangeを直接太字にする!
p.Range.Bold = True

End If

Next p

‘ 完了の合図
MsgBox “処理が完了しました!”, vbInformation

End Sub

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

たったこれだけの短いコードですが、Word VBAの「おいしいところ」がギュッと詰まっています。初心者さんが押さえておくべきポイントを3つに分けて解説しますね。

1. `Paragraphs` コレクションと `For Each` のコンビネーション

For Each p In targetDoc.Paragraphs

文書は「段落(Paragraph)」の集まりです。`For Each ~ In ~` という構文を使うことで、「最初から最後までの段落を、上から順番に変数 `p` に代入してね」という指示を簡単に書くことができます。

2. 見えない下敷き `p.Range` の正体

ここが一番のキモです。変数 `p` は「段落そのもの」ですが、文字の書式を変えたり文字を読み取ったりするには、その段落が持つ`Range`(範囲)を取り出す必要があります。それが `p.Range` です。
「段落という箱から、操作用の下敷きを取り出した」とイメージしてください。

3. まるごと太字にする `p.Range.Bold = True`

取り出したRangeに対して、`.Bold = True` と命令するだけで、その段落全体が鮮やかに太字に変わります。
わざわざ文字を全選択(Select)する必要なんて、最初からないのです。

初学者がハマりやすい「落とし穴」と対策

このコードを書いて動かしたとき、初心者が必ずと言っていいほどハマる「罠」があります。それは「余計な改行コードの存在」です。

Wordの段落のテキスト(`p.Range.Text`)の末尾には、目に見えない改行マーク(段落記号:`vbCr`)が必ず含まれています。
そのため、もし完全一致で `If p.Range.Text = “【要確認】” Then` などと書いてしまうと、「文字の後ろに改行があるから一致しない!」と判定され、いつまで経っても装飾がされない現象が起きます。

対策:

今回使った `InStr` 関数は、「部分一致」を探す機能を持っています。「文字の中に『【要確認】』が含まれていればOK」という判定方法にするだけで、この改行まわりのトラブルをスマートに回避できるというわけです。実務では部分一致の `InStr` を使うのが鉄則ですよ。

おわりに:ここをクリアすれば、あなたももう初心者卒業!

お疲れ様でした!
`Selection` に頼らず、`Range` を使って裏側でデータを処理する感覚は掴めましたか?

この基礎(「探す ➔ Rangeを特定する ➔ 書式を操作する」)さえマスターしてしまえば、フォントの色を変えたり、特定の文字に背景色をつけたり、あるいは特定の文字列をごっそり置換したりする応用も、すべて同じ発想で実現できるようになります。

「マクロの記録」の呪縛を解き放ち、ぜひご自身の自由な手で、エレガントなWord自動化の世界を切り拓いていってくださいね。あなたのVBAライフを、これからも応援しています!

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