【実務・中級編】【初心者向け】置換後の文字列に「特定のスタイル」を自動適用して見出しを整える – Word VBA解析バイブル

スポンサーリンク

Word VBAの「Find」を使いこなす:スタイル適用による構造化の自動化設計

Word VBAにおける`Find`オブジェクトは、単なる「検索と置換」の道具ではない。文書の構造を再定義し、ドキュメントの「意味」をプログラムに理解させるための強力なインターフェースだ。

多くの初心者は、マクロ記録機能が吐き出す冗長なコードに依存し、`Selection`オブジェクトを動かして画面をチラつかせ、処理速度を低下させている。プロの現場では、「画面を触らず、メモリ上で完結させる」のが鉄則だ。

今回は、特定の文字列を検索し、置換と同時に「見出しスタイル」を適用する、実務に耐えうる堅牢なコード設計を伝授する。

—

1. なぜ「Selection」を使ってはいけないのか

初心者が書くコードの典型はこれだ。

‘ 【NG例】Selectionに依存した実装
Selection.Find.ClearFormatting
Selection.Find.Execute FindText:=”章タイトル”
Selection.TypeText Text:=”第1章 タイトル”
Selection.Style = ActiveDocument.Styles(“見出し 1”)

この書き方は、カーソル位置に強く依存し、文書が長くなればなるほど処理速度が崩壊する。`Selection`はGUIの操作を模倣するものであり、バックグラウンドでの自動化には適さない。

正解は `Range` オブジェクトを使うことだ。 検索範囲をメモリ内で完結させることで、Wordは画面描画を停止し、処理速度を劇的に向上させる。

—

2. 堅牢な構造化を実現するプロダクションコード

以下は、検索対象を特定し、置換と同時にスタイルを適用する汎用的なプロシージャである。このコードは、再利用性を高めるために「対象文字列」と「適用スタイル」を引数で受け取る設計にしている。

‘ ———————————————————
‘ 指定したキーワードを検索し、スタイルを適用して置換する
‘ @param targetText 検索する文字列
‘ @param replaceText 置換後の文字列
‘ @param styleName 適用するスタイル名
‘ ———————————————————
Sub ApplyHeadingStyle(targetText As String, replaceText As String, styleName As String)
Dim rng As Range
Set rng = ActiveDocument.Content ‘ 文書全体を対象にする

With rng.Find
.ClearFormatting
.Replacement.ClearFormatting

.Text = targetText
.Replacement.Text = replaceText

‘ 検索オプション:すべて置換
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False

‘ 全て置換を実行
.Execute Replace:=wdReplaceAll
End With

‘ 置換後の文字列にスタイルを適用する二段階アプローチ
‘ ※置換直後にスタイルを適用するのはRange操作の常套手段
Set rng = ActiveDocument.Content
With rng.Find
.Text = replaceText
Do While .Execute(Replace:=wdReplaceNone) = True
‘ 見つかった箇所に直接スタイルを適用
rng.Style = ActiveDocument.Styles(styleName)
rng.Collapse Direction:=wdCollapseEnd ‘ 次の検索へ進む
Loop
End With
End Sub

—

3. 実務で「バグ」を生ませないための3つの注意点

① 曖昧なスタイル指定の排除

`ActiveDocument.Styles(“見出し 1”)` と書く際、もし対象のドキュメントにそのスタイルが存在しない場合、VBAは即座に停止する。
必ず事前に `On Error Resume Next` で存在確認を行うか、スタイルが存在することを前提としたテンプレートファイル(.dotx)で運用を統制すること。

② 文書構造の破壊を防ぐ

「全置換」は強力だが、意図しない箇所まで置換するリスクがある。特定の条件下(例:特定の段落内のみ)で動作させる必要がある場合は、`rng` の範囲を `ActiveDocument.Paragraphs(i).Range` と絞り込むことで、スコープを安全に管理せよ。

③ データベース連携時の落とし穴

Excelや外部DBから文字列を読み込んで置換を行う場合、「改行コード」や「特殊文字」が混入していないか注意が必要だ。外部データは常に汚れていると考え、`Replace(data, vbCr, “”)` のようにクリーニングする工程を挟むのがエンジニアとしての矜持である。

—

まとめ:自動化の先にあるもの

Word VBAによる自動化の真髄は、「見た目を整える」ことではない。「文書の論理構造(セマンティクス)を正しく構築する」ことにある。

スタイルを正しく適用すれば、後続の「目次作成」や「PDF変換時のしおり生成」が自動化される。今回紹介したコードをベースに、あなたの業務フローに合わせた「構造化の自動エンジン」を構築してほしい。

コードは嘘をつかない。設計さえ正しければ、Wordはあなたの最も優秀な部下になるはずだ。

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