やあ。Word VBAの世界へようこそ。
「マクロの記録」ボタンを押して、生成された無機質なコードの羅列に呆然とした経験はないかな?大丈夫、今日でその「記録」の呪縛から解き放たれよう。
今回は、Wordの文書内で「警告」や「注意」というキーワードを見つけ出し、その段落だけをスタイリッシュに枠線で囲むという、実務で死ぬほど重宝する自動化ツールを一緒に作る。
ただのコード紹介じゃない。Wordの「オブジェクト構造」を意識した、プロの設計思想を君に授けるよ。
—
1. なぜ「段落(Paragraph)」を制する必要があるのか?
Word VBAにおいて、最も頻繁に、そして慎重に操作すべき対象が `Paragraph`(段落)オブジェクトだ。
君たちが普段何気なく打っているEnterキー。あれは単なる改行ではなく、Wordにとっては「段落の終わり」を意味する区切り文字だ。Wordの書式は、この段落という単位で管理されている。
つまり、「段落を制する者は、Wordの文書構造を制する」と言っても過言ではないんだ。
—
2. 実装:キーワードを検知して枠線を引く魔法のコード
まずは、以下のコードをVBAエディタ(`Alt + F11` で起動)に貼り付けてみてほしい。
Sub HighlightWarningParagraphs()
Dim para As Paragraph
Dim rng As Range
‘ 文書内のすべての段落をループ処理する
‘ パフォーマンスを考慮し、Documentオブジェクトから直接アクセスする
For Each para In ActiveDocument.Paragraphs
‘ 段落範囲(Range)を取得
Set rng = para.Range
‘ 特定のキーワードが含まれているかチェック
If InStr(rng.Text, “【警告】”) > 0 Or InStr(rng.Text, “【注意】”) > 0 Then
‘ 枠線を設定(Bordersオブジェクトを操作)
With rng.ParagraphFormat.Borders
.Enable = True ‘ 枠線を有効化
.InsideLineStyle = wdLineStyleNone
.OutsideLineStyle = wdLineStyleSingle ‘ 一重線
.OutsideColor = wdColorRed ‘ 赤色に設定
.OutsideLineWidth = wdLineWidth050pt ‘ 線の太さ
End With
‘ 背景色も少し薄く塗ると視認性が上がる(おまけ)
rng.Shading.BackgroundPatternColor = wdColorGray10
End If
Next para
MsgBox “強調表示の自動化が完了しました。”, vbInformation
End Sub
—
3. コードの本質を解剖する(ここが重要!)
初学者が陥りやすい罠と、プロが意識しているポイントを解説しよう。
① `For Each` で回す理由
`For i = 1 To ActiveDocument.Paragraphs.Count` と書くこともできるが、`For Each` の方が圧倒的にモダンで読みやすい。オブジェクトそのものを直接取得できるため、メモリ効率の面でもこちらが推奨されるんだ。
② `InStr` 関数の役割
`InStr(検索対象, 検索文字列)` は、文字列が含まれているかを「位置(数値)」で返す関数だ。0より大きければ「含まれている」と判断できる。非常にシンプルだが、強力なフィルタリングツールだよ。
③ `Borders` オブジェクトの罠
多くの人がここで躓く。「枠線を消したいのに消えない!」と。
Wordの枠線は、一度設定すると設定が残る性質がある。`rng.ParagraphFormat.Borders.Enable = False` と明示的にオフにする処理を入れないと、意図しない場所に線が残ることがあるんだ。今回は「描画」だけだが、運用する際は「リセット処理」もセットで考えると、君のツールは一気にプロ仕様になる。
—
4. さらに上を目指す君へ:パフォーマンスの極意
このコードは小さな文書なら一瞬で終わる。しかし、数百ページあるマニュアルで実行したらどうなるだろう?
- 画面更新を止める: `Application.ScreenUpdating = False` を冒頭に入れて、処理が終わったら `True` に戻す。これだけで実行速度が数倍になることもある。
- Rangeの活用: 今回は `para.Range` を使ったが、大規模な検索が必要な場合は `Find` オブジェクトを使う方が高速だ。
—
最後に:先輩からのアドバイス
「マクロの記録」は、あくまでコードの「書き方」を知るための辞書に過ぎない。本当に大切なのは、「Wordが文書をどういう階層で管理しているか」を理解することだ。
今回のコードを動かしてみて、もし「枠線の太さを変えたい」「特定のスタイルが適用されている段落だけ対象にしたい」と思ったら、それは君がステップアップした証拠だ。
Word VBAは、君の手の届かない面倒な作業を、君の代わりに文句も言わずに何千回でもこなしてくれる最高の相棒になる。さあ、次はどんな面倒な作業を自動化しようか?
またいつでも相談してくれ。応援しているよ。
