Word VBAの「直接書式」を駆逐せよ:文書構造を破壊する手動装飾を自動スタイル化する極意
Word文書が「メンテナンス不能なゴミの山」と化す最大の原因は、直接書式(Direct Formatting)の蔓延だ。
ユーザーが「見出しのように見えるから」という理由で手動でフォントサイズを上げ、太字にし、インデントを微調整する。この行為は、Wordの持つ階層構造を破壊し、後の修正を不可能にする技術的負債そのものだ。
今日は、その場しのぎの直接書式を抽出し、それらを正規の「スタイル」へと昇華させる、アーキテクト級の自動化手法を伝授する。
—
1. なぜ「直接書式」の削除だけでは不十分なのか
多くの初学者は「`Range.ClearFormatting`で直接書式を消せばいい」と考える。だが、それは思考停止だ。書式を消せばドキュメントの見た目は崩壊し、エンドユーザーからのクレームが飛んでくる。
真の自動化エンジニアがやるべきは、「手動で行われた装飾のパターンを解析し、それをWordの正規の作法(スタイル)として登録し直す」ことだ。
戦略のポイント
1. 解析: 文書内の全段落を走査し、直接書式(Font/Paragraphオブジェクトのプロパティ)をハッシュ化する。
2. 集約: 頻出する書式パターンを抽出する。
3. 置換: 抽出したパターンに対し、新規スタイルを適用して直接書式をパージする。
—
2. 実装:直接書式抽出エンジンの設計
以下は、文書内の段落を走査し、特定の書式パターンを「スタイル」として自動定義するための堅牢なコードである。
Option Explicit
‘ ———————————————————
‘ 目的:直接書式が適用された段落を解析し、独自のスタイルとして登録する
‘ 注意:実行前にバックアップを必須とすること
‘ ———————————————————
Public Sub RefactorDirectFormattingToStyle()
Dim doc As Document: Set doc = ActiveDocument
Dim para As Paragraph
Dim styleName As String
Dim counter As Long
Application.ScreenUpdating = False
For Each para In doc.Paragraphs
‘ 既定の標準スタイル以外の段落を対象にする
If para.Style.NameLocal <> “標準” Then GoTo NextPara
‘ ここで独自の解析ロジックを呼び出す
‘ 例: フォントサイズ12pt、太字、中央揃えのパターンを検出
If para.Range.Font.Size = 12 And para.Range.Font.Bold = wdToggle Then
styleName = “AutoDerived_Bold_12pt”
‘ スタイルが存在しなければ作成
CreateStyleIfNotExist doc, styleName, para.Range
‘ スタイルを適用し、直接書式をクリア
para.Style = doc.Styles(styleName)
para.Range.Font.Reset
End If
NextPara:
Next para
Application.ScreenUpdating = True
End Sub
Private Sub CreateStyleIfNotExist(doc As Document, styleName As String, rng As Range)
On Error Resume Next
Dim sty As Style
Set sty = doc.Styles(styleName)
If sty Is Nothing Then
Set sty = doc.Styles.Add(Name:=styleName, Type:=wdStyleTypeParagraph)
With sty
.Font.Name = rng.Font.Name
.Font.Size = rng.Font.Size
.Font.Bold = rng.Font.Bold
.ParagraphFormat.Alignment = rng.ParagraphFormat.Alignment
End With
End If
On Error GoTo 0
End Sub
—
3. 現場で生き残るための「鉄則」
このスクリプトを運用する際、以下の3点に注意を払わなければ、ツールはただの破壊兵器になる。
① 「Font.Reset」の罠
`para.Range.Font.Reset` は非常に強力だが、同時に「やりすぎ」る可能性がある。スタイルに継承させるべきプロパティと、個別に維持すべきプロパティを明確に分ける必要がある。`Reset`を呼ぶ前に、必要な設定がスタイル側に正しく転写されているか、必ず検証すること。
② スタイルの名前空間の汚染
自動作成するスタイルには必ずプレフィックス(例: `AutoDerived_`)を付けること。既存の組み込みスタイルと名前が衝突すると、Wordは即座にエラーを吐くか、予期せぬ上書きが発生する。
③ トランザクション処理の考え方
文書が巨大な場合、VBAのループ処理はメモリを大量に消費する。
- Undoスタックの回避: `Application.UndoRecord` を使い、処理全体を一つの操作単位としてまとめることが、保守上の鉄則だ。
- データベース連携: もし複数の文書を横断して標準化する場合、スタイル定義をJSONや外部テンプレートファイルとして保存し、それを読み込む構造にすべきだ。ハードコーディングは死を意味する。
—
結論:自動化は「掃除」ではない、「再構築」である
直接書式をスタイルに置換する作業は、単なる効率化ではない。文書の「メタデータ」を正しく構造化する知的生産活動だ。
スタイルを正しく適用された文書は、将来的に目次の自動生成、PDF変換時のタグ付け、そして他システムへのデータ移行において、圧倒的な優位性を持つ。
君たちが書くその一行のコードが、数年後の誰かの仕事を救う。それが、伝説の自動化エンジニアたる我々の責務だ。さあ、今すぐゴミのような手動書式を駆逐し、Word文書を「構造化された資産」へと生まれ変わらせよう。
