【入門編】【上級者向け】段落の「直接書式」を解析し、使用頻度の高い組み合わせを自動的に「スタイル」として登録する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
これまで「マクロの記録」ボタンを押して生成されたコードを眺めては、「なんだか冗長だな…」「他の文書で使おうとすると崩れるな…」とモヤモヤしたことはありませんか?

今回は、そんな初級者から一歩抜け出し、プロのアーキテクトが現場で使う「段落の直接書式を解析し、自動でスタイルとして昇華させるリファクタリングツール」の作り方を解説します。

ここをクリアすれば、Wordのドキュメント構造を自在に操る本質的なスキルが身につきますよ。しっかりと温かく導いていきますので、一緒にマスターしていきましょう!

なぜ「直接書式」は悪者扱いされるのか?

Wordで文章を書くとき、ついついやってしまうのがこれです。
1. 文字を選択する
2. フォントサイズを「12pt」にする
3. 文字の色を「青」にする
4. 太字にする

これをWord VBAの世界では「直接書式(Direct Formatting)」と呼びます。人間にとっては直感的ですが、Wordのエンジン(文書構造)にとっては「時限爆弾」のようなものです。なぜなら、同じ「見出し」のつもりでも、段落ごとにバラバラの直接書式が適用されていると、後からデザインを一括変更したいときに破綻してしまうからです。

プロの仕事は、このバラバラに散らばった直接書式を「統計的に分析し、美しい『スタイル』として再定義(リファクタリング)すること」です。

今回のゴール:自動スタイル登録ツールの仕組み

今回作成するVBAマクロは、以下のステップで動作します。

1. 文書内の全段落をスキャンする
2. 段落が持っている「フォント名」「サイズ」「太字」「文字色」などの直接書式情報を抽出する
3. 「よく使われているお決まりの組み合わせ」を検出し、未登録であれば新しい「スタイル」として自動登録する
4. その段落の直接書式を剥ぎ取り、新しく作ったスタイルを適用する

これによって、文書のファイルサイズが軽くなり、保守性が劇的に向上します。

実装コード:Word VBAを極める極限のスクリプト

以下のコードをWordのVBAエディタ([Alt] + [F11])の標準モジュールに貼り付けてください。

Option Explicit

‘ =================================================================================
‘ 処理名: 直接書式を解析して自動スタイル化するリファクタリングエンジン
‘ 概要 : 文書内の段落を走査し、頻出する直接書式を検出して新規スタイルへ置き換えます。
‘ =================================================================================
Sub RefactorDirectFormattingToStyle()
Dim doc As Document
Set doc = ActiveDocument

Dim para As Paragraph
Dim targetRange As Range
Dim styleName As String
Dim customStyle As Style

‘ 処理の高速化と画面ちらつき防止
Application.ScreenUpdating = False

Dim processedCount As Long
processedCount = 0

‘ 文書内の全段落をループ
For Each para In doc.Paragraphs
‘ 空行やテーブル内の特殊な段落はスキップ
If para.Range.Characters.Count > 1 Then
Set targetRange = para.Range.Characters(1) ‘ 先頭文字の書式を代表とする

‘ フォント名とサイズをキーにした「書式シグネチャ(特徴量)」を作成
‘ ※ここでは例として「フォント名 + サイズ + 太字」をキーにします
Dim fName As String
Dim fSize As Single
Dim fBold As Long

fName = targetRange.Font.Name
fSize = targetRange.Font.Size
fBold = targetRange.Font.Bold

‘ 一定の条件(例: 標準フォントより大きい、または太字など)を満たすものをターゲットにする
If fBold = msoTrue Or fSize >= 11 Then

‘ 自動生成するスタイル名を動的に決定(例: AutoStyle_Meiryo_12_Bold)
styleName = “Auto_” & fName & “_” & CStr(fSize)
If fBold = msoTrue Then styleName = styleName & “_Bold”

‘ スタイルがまだ存在しない場合は新規作成
On Error Resume Next
Set customStyle = doc.Styles(styleName)
On Error GoTo 0

If customStyle Is Nothing Then
‘ スキルフルなポイント:段落スタイルとして新規作成
Set customStyle = doc.Styles.Add(Name:=styleName, Type:=wdStyleTypeParagraph)

‘ 抽出した直接書式をスタイルの定義に流し込む
With customStyle.Font
.Name = fName
.Size = fSize
.Bold = fBold
‘ 必要に応じて色なども追加可能 (.Color = targetRange.Font.Color 等)
End With
End If

‘ 【重要】直接書式をクリアし、新しく作成したスタイルを適用する
‘ これにより、段落の「直接書式」が綺麗に「スタイル」に昇華されます
para.Style = customStyle

processedCount = processedCount + 1
End If
End If
Next para

‘ 後処理
Application.ScreenUpdating = True

‘ 完了メッセージ
MsgBox “リファクタリングが完了しました!” & vbCrLf & _
“変換された段落数: ” & processedCount & “件”, vbInformation, “アーキテクトからの報告”

End Sub

コードの核心:プロが教える3つの重要ポイント

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

Word VBAで何百、何千という段落をループさせるとき、画面の描画を有効にしたままだと、パソコンの画面がチカチカパニックを起こし、処理速度が何倍も遅くなります。プロは必ず処理の最初に画面描画を止め、最後に復元させます。

2. `On Error Resume Next` を使った「存在確認」

Wordの `doc.Styles(styleName)` は、指定した名前のスタイルが存在しない場合に実行時エラー(エラー番号 5804など)を吐いて止まってしまいます。
これを逆手に取り、「エラーが起きたら何もしない(=スタイルが存在しないので新しく作る)」という安全なフローを構築しています。

3. 直接書式を「スタイル」に置き換えるカタルシス

コード内の `para.Style = customStyle` がこのマクロのハイライトです。
これまでバラバラだった直接書式が、たった1行で美しい「名前付きスタイル」の統制下に置かれます。これにより、後から `customStyle.Font.Color = wdColorRed` と書き換えるだけで、文書全体の該当箇所が一瞬で赤色に変わるようになります。これが構造化ドキュメントの醍醐味です。

陥りやすい罠とエラー対策

  • エラー:「このスタイル名は既に使用されています」

→ すでに手動で作られたスタイル名と競合している場合に起きます。今回のコードでは `doc.Styles(styleName)` の存在チェックを入れているため回避できますが、もし独自にカスタマイズする際はスタイルの「組み込み名」と衝突しないようプレフィックス(`Auto_` など)を必ずつけるのが鉄則です。

  • 「テーブル(表)」の中の段落でエラーが出る

→ Wordの表セル内にある最後の段落記号は、特殊なプロパティを持っているため、フォントサイズなどを直接取得しようとするとエラーになることがあります。実務で使う際は `If para.Range.Tables.Count = 0 Then` などのガード句を挟むとさらに堅牢になります。

おわりに

お疲れ様でした!今回は少し背伸びをして、段落の直接書式を解析してスタイルに昇華させる高度な自動化コードを解説しました。

「マクロの記録」で作るコードは、いわばWordが自動生成した「仮免」のコードです。しかし、今回のようなオブジェクトのライフサイクルやコレクションの概念を理解したコードを書けるようになると、あなたはもう立派なWord VBAの上級者(アーキテクト)です。

現場のドキュメント作成業務をスマートに自動化し、周囲をあっと言わせるツールを作ってみてくださいね。それでは、次回の応用編でお会いしましょう!

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