【実務・中級編】【中級者向け】段落の「アウトラインレベル」を解析して、見出し構成をCSV出力する – Word VBA解析バイブル

スポンサーリンク

構造を制する者はWordを制す:アウトラインレベル解析による文書の「地図」生成術

Wordの自動化において、最も頻繁に遭遇する落とし穴。それは「力任せな検索」です。
「特定の文字列を探して、その後の段落のフォントを変える」……そんな場当たり的なコードを書いていませんか?

ドキュメントというものは、単なる文字の羅列ではありません。「アウトラインレベル」という秩序(ロジック)で構成された階層構造体です。この構造を理解し、抽出する力を持つだけで、あなたの業務効率化のレベルは一段階、いや二段階引き上がります。

今回は、Wordの深層にあるアウトラインレベルを解析し、文書の「目次」をCSVとして吐き出す、実務レベルのコードを伝授します。

1. なぜ「Range」を直接叩いてはいけないのか

多くの初心者は `Selection.Next` を繰り返して文書を巡回します。しかし、これはプロのやり方ではありません。`Selection` はUIと同期するため、処理が極めて低速であり、また画面描画の影響でエラーを誘発します。

鉄則:`Paragraphs` コレクションをイテレートせよ。

Wordの `Paragraphs` オブジェクトには、各段落の `OutlineLevel` プロパティが保持されています。これを利用すれば、文書内のすべての見出し構成を、わずか数ミリ秒でメモリ上に展開可能です。

2. 堅牢な設計:データ抽出のプロトコル

単にCSVを出力するだけなら誰でも書けます。しかし、以下の3点を考慮しなければ、「実務で使えるツール」とは言えません。

1. 階層の正規化: `wdOutlineLevel1`~`9` を数値として取得し、CSVの列を制御する。
2. 文字コードのケア: WordはUTF-16ですが、CSVとして出力する際は `ADODB.Stream` を用いてUTF-8(BOM付き)で保存し、Excelでの文字化けを防ぐのが定石です。
3. エラーハンドリング: 壊れたドキュメントや、保護されたセクションに対する耐性を持たせる。

3. 実践コード:高速・高精度の構成抽出エンジン

以下は、現在の文書から見出しを抽出し、デスクトップに `OutlineMap.csv` を生成するコードです。`FileSystemObject` ではなく、あえて `ADODB.Stream` を使うことで、大規模ファイルでも文字化けや書き込みエラーを回避します。

Option Explicit

‘ 必要な参照設定: Microsoft ActiveX Data Objects x.x Library
Public Sub ExportOutlineToCSV()
Dim doc As Document: Set doc = ActiveDocument
Dim para As Paragraph
Dim outputContent As String
Dim filePath As String

‘ CSVのヘッダー定義
outputContent = “Level,Text” & vbCrLf

‘ 1. 段落コレクションを高速ループ
For Each para In doc.Paragraphs
‘ アウトラインレベルが「本文(wdOutlineLevelBodyText)」以外のみ抽出
If para.OutlineLevel <> wdOutlineLevelBodyText Then
‘ 改行コードやタブを除去してデータをクリーンに保つ
Dim cleanText As String
cleanText = Replace(Replace(para.Range.Text, vbCr, “”), vbTab, “”)

‘ CSV形式で蓄積
outputContent = outputContent & (para.OutlineLevel) & “,””” & cleanText & “””” & vbCrLf
End If
Next para

‘ 2. UTF-8(BOM付き)で保存(Excelで開いても文字化けしない)
filePath = Environ(“USERPROFILE”) & “\Desktop\OutlineMap.csv”

Dim adoStream As Object
Set adoStream = CreateObject(“ADODB.Stream”)

With adoStream
.Type = 2 ‘ adTypeText
.Charset = “UTF-8”
.Open
.WriteText outputContent
.SaveToFile filePath, 2 ‘ adSaveCreateOverWrite
.Close
End With

MsgBox “文書構造の解析が完了しました。” & vbCrLf & “保存先: ” & filePath, vbInformation
End Sub

4. プロの視点:このツールをどう拡張すべきか

このコードは、いわば「情報の骨格」を抽出するエンジンです。ここから先は、あなたの実務に合わせて以下のように進化させてください。

  • データベース連携: `ADODB.Connection` を用いて、この抽出したデータをそのままSQL ServerやSQLiteに流し込み、ドキュメントの更新履歴管理データベースを構築する。
  • 整合性チェック: 抽出したレベル構造を配列として保持し、「見出し1の次にいきなり見出し3が来ている」といった構造的な不備を自動検知するバリデーターへと昇華させる。
  • 再帰構造の解析: もしドキュメントが複雑な入れ子構造になっている場合、`Range.ListFormat` を併用することで、箇条書きの階層とアウトラインレベルを統合した「完全なツリー構造」を出力できます。

最後に:自動化は「構造の理解」から始まる

Word VBAにおいて、コードの美しさは「どれだけWordの内部モデルに寄り添えるか」で決まります。場当たり的な操作ではなく、ドキュメントが持つ「論理的な地図」を読み解く。それが、エンジニアとしての格を分ける境界線です。

このコードをあなたのツールボックスに加え、ぜひ実務の現場でその速度を体感してください。次回の自動化の現場で、またお会いしましょう。

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