【入門編】【中級者向け】段落のインデント設定を階層レベルに応じて自動計算して適用する – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して、生成された呪文のようなコードに絶望したことはありませんか?「選択して、何かをする」という記録マクロの癖から抜け出すと、Word VBAは劇的に美しく、そして強靭になります。

今回は、実務で最も要望が多い「アウトラインの階層レベルに応じて、インデント幅を自動計算して美しく整える」というテーマを深掘りします。

ここをクリアすれば、あなたも「脱・初心者」のステージへ一歩踏み出せますよ。温かく導きますので、一緒に本質をマスターしていきましょう!

なぜ「インデントの自動計算」が必要なのか?

企画書、仕様書、論文……。ドキュメントの美しさは、情報の構造(階層)が視覚的に正しく表現されているかで決まります。

  • 階層1:左インデント 0mm
  • 階層2:左インデント 5mm
  • 階層3:左インデント 10mm

これを手動でぽちぽち設定するのは、エンジニアの仕事ではありません。さらに、途中で見出しを追加・削除したとき、インデントが狂ってイライラした経験はありませんか?
Wordの「アウトラインレベル」という本質的なデータ構造をVBAで読み取り、計算式によって一撃で再計算・適用するロジックを手に入れれば、ドキュメント整形は一瞬で終わります。

Word VBAの基本:オブジェクトの親子関係を捉える

コードを書く前に、Wordの心臓部である「オブジェクトモデル」の基本を押さえましょう。
Word VBAは、入れ子構造(ツリー構造)になっています。

ActiveDocument (文書)
┗ Paragraphs (段落の集まり)
┗ Paragraph (1つの段落)
┣ OutlineLevel (アウトラインレベル:ここで階層を判定)
┗ LeftIndent (左インデント:ここに値を代入)

「今、どの段落に注目しているか」をループで回し、その段落の `OutlineLevel` を見て、動的に `LeftIndent` を計算して代入する。これが今回構築するプログラムの全体像です。

実装コード:階層連動インデント自動整形エンジン

実務の現場でそのままコピペして使える、堅牢なコードを用意しました。
単位の変換(ミリからポイントへの換算)や、本文(レベル外)の除外処理など、プロの技を随所に盛り込んでいます。

Sub AutoFormatIndentByOutlineLevel()
‘ =====================================================================
‘ 目的: アウトラインレベルに応じて、段落の左インデントを自動計算・適用する
‘ 対象: アクティブドキュメントのすべての段落
‘ =====================================================================

Dim targetPara As Paragraph
Dim indentStepMM As Single
Dim indentStepPoints As Single
Dim currentLevel As Long

‘ 1. 階層ごとのインデント幅のベース(ミリ単位)を設定
‘ 例:階層が1つ深くなるごとに 6mm ずつインデントを深くする
indentStepMM = 6#

‘ 2. Word VBAの内部単位(ポイント)に変換する
‘ ※1mm = 約 2.83465 ポイント (1インチ = 72ポイント = 25.4ミリ)
indentStepPoints = indentStepMM 2.83465

‘ 画面のちらつきを抑え、処理速度を爆発的に上げるお約束の呪文
Application.ScreenUpdating = False

‘ ドキュメント内の全段落を走査する
For Each targetPara In ActiveDocument.Paragraphs

‘ 段落のアウトラインレベルを取得する
‘ (WdOutlineLevel 列挙体: wdOutlineLevel1 ~ 9, および wdOutlineLevelBodyText)
currentLevel = targetPara.OutlineLevel

‘ 本文(レベル9より下、または本文レベル)は対象外とする判定
If currentLevel >= wdOutlineLevel1 And currentLevel <= wdOutlineLevel9 Then ' 【重要】インデント計算ロジック ' レベル1 = (1 - 1) 幅 = 0mm ' レベル2 = (2 - 1) 幅 = 6mm ' レベル3 = (3 - 1) 幅 = 12mm ... と自動計算されます targetPara.LeftIndent = (currentLevel - 1) indentStepPoints ' ついでに、見出しらしく「ぶら下げインデント」や「行間」を整えたければここに追記可能 ' targetPara.FirstLineIndent = -10 ' 例: ぶら下げにする場合 End If Next targetPara ' 画面描画を復元 Application.ScreenUpdating = True ' 完了メッセージ MsgBox "インデントの自動整形が完了しました!", vbInformation, "Smart Format" End Sub ---

コードのポイントと「陥りやすい罠」の回避策

このコードには、初学者がハマりやすいポイントを回避するための「プロの知見」が詰まっています。

1. 単位の罠(ミリとポイント)

Word VBAのインデントプロパティ(`LeftIndent` など)が受け付けるのは、ミリでもセンチでもなく「ポイント(Points)」です。
もし `targetPara.LeftIndent = 6` と書いてしまうと、「たったの6ポイント(約2.1ミリ)しか下がらない!バグだ!」と焦ることになります。
コード内で行っている ` 2.83465` という換算係数は、実務では必須の知識です。

2. 本文(BodyText)を巻き込まないガード処理

`ActiveDocument.Paragraphs` でループを回すと、普通の「ただの文章(本文)」もすべて処理の対象になってしまいます。
本文の `OutlineLevel` は `wdOutlineLevelBodyText`(数値としては 10)になります。そのため、`If currentLevel >= wdOutlineLevel1 And currentLevel <= wdOutlineLevel9` というガードを挟むことで、「見出しとして設定されている段落だけ」を正確に狙い撃ちしています。

3. `Application.ScreenUpdating = False` の重要性

ページ数が数百ページある巨大なWordファイルを処理するとき、画面を描画しながらループを回すと、パソコンがフリーズしたかのように処理が遅くなります。
処理の最初に画面更新を止め、最後に復元する。この配慮ができるだけで、あなたの書くコードの「格」が一段上がります。

まとめ:ここをクリアすれば、Word VBAは怖くない!

今回学んだ「プロパティの値をロジックで動的に計算して代入する」というアプローチは、ExcelでもWordでも自動化の王道です。

  • 固定値ではなく、オブジェクトの状態(レベル)を読み取る
  • 単位を正しく理解し、計算式に落とし込む
  • 不要な画面描画を省いてパフォーマンスを担保する

これらを意識するだけで、マクロの記録から完全に脱却し、自分の手でシステムを設計している実感が湧いてくるはずです。

「ここをこう変えたらどうなるだろう?」という好奇心を大切に、ぜひご自身の環境でも試してみてくださいね。あなたの業務自動化の旅を、これからも応援しています!

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