【入門編】【中級者向け】段落の「段落前後の間隔」を、セクションごとに自動調整するツール – Word VBA解析バイブル

スポンサーリンク

ようこそ、Word VBAの深淵なる世界へ。

「マクロの記録」を卒業し、自分の意図通りに文書を操りたいと考え始めたあなた。その一歩は、Wordというアプリケーションの本質を理解する素晴らしい旅の始まりです。

今日は、Word文書の「呼吸」とも言える段落の間隔(段落前・段落後のスペース)を、セクション単位でダイナミックに制御するという、極めて実用的かつ奥深いテーマを扱います。

Wordは単なるワープロソフトではありません。その背後には、緻密に計算されたオブジェクトの階層構造が広がっています。ここをクリアすれば、あなたは「Wordに使われるユーザー」から「Wordを指揮するマエストロ」へと進化できるはずです。

1. なぜ「セクション」を意識する必要があるのか?

多くの初心者は、文書全体の段落を均一に整えようとします。しかし、実務の文書はそうはいきません。

  • 第1セクション(表紙): ゆったりとした余白を持たせたい。
  • 第2セクション(目次): 行間を詰めて一覧性を高めたい。
  • 第3セクション以降(本文): 読みやすさを重視した標準的な間隔にしたい。

これらを一つずつ手動で設定するのは苦行です。VBAを使えば、「セクションの役割」を判断し、一瞬で最適なレイアウトを適用できます。

2. Word VBAの階層構造を理解する

コードを書く前に、頭の中にこの地図を描いてください。

1. Application(Wordそのもの)
2. Document(開いているファイル)
3. Sections(文書の区切り)
4. Paragraphs(段落の集まり)
5. ParagraphFormat(書式設定の本体)

私たちが操作したいのは、4番目の「段落」ですが、それを「セクション」という箱ごとに取り出すのが今回のミッションです。

3. 【実践】セクション別・段落間隔自動調整ツール

では、具体的なコードを見ていきましょう。このコードは、セクション番号に応じて、段落前の間隔(SpaceBefore)と段落後の間隔(SpaceAfter)を自動で書き換えるものです。

Sub AdjustParagraphSpacingBySection()
‘ ================================================================
‘ プログラム名:セクション別・段落間隔一括制御ツール
‘ 目的:セクションの役割(順番)に応じて、段落の上下余白を自動調整する
‘ ================================================================

Dim sec As Section
Dim para As Paragraph
Dim secIndex As Integer

‘ 画面更新を停止して処理速度を向上させる(プロの定石)
Application.ScreenUpdating = False

‘ 文書内の全セクションを順番にループ処理する
For Each sec In ActiveDocument.Sections
secIndex = sec.Index ‘ 現在何番目のセクションかを取得

‘ セクションごとに処理を分岐
Select Case secIndex
Case 1
‘ — 第1セクション(例:表紙)の設定 —
‘ 段落前を12pt、段落後を12ptに設定
Call ApplySpacing(sec.Range, 12, 12)

Case 2
‘ — 第2セクション(例:目次)の設定 —
‘ 目次は詰めたいので、段落前後を0ptに設定
Call ApplySpacing(sec.Range, 0, 0)

Case Else
‘ — 第3セクション以降(例:本文)の設定 —
‘ 標準的な読みやすさ:段落前を6pt、段落後を0ptに設定
Call ApplySpacing(sec.Range, 6, 0)

End Select
Next sec

‘ 画面更新を再開
Application.ScreenUpdating = True

MsgBox “全てのセクションのレイアウト調整が完了しました!”, vbInformation
End Sub

”’

”’ 指定された範囲内の全段落に間隔を適用する補助ルーチン
”’

Sub ApplySpacing(rng As Range, beforePt As Single, afterPt As Single)
Dim p As Paragraph

‘ 範囲内のすべての段落に対してループ
For Each p In rng.Paragraphs
‘ 段落の書式(ParagraphFormat)にアクセスする
With p.Format
.SpaceBefore = beforePt ‘ 段落前の間隔
.SpaceAfter = afterPt ‘ 段落後の間隔

‘ 【Tips】もし行間(行送り)も変えたい場合はここに追加
‘ .LineSpacingRule = wdLineSpaceExactly
‘ .LineSpacing = 18
End With
Next p
End Sub

4. コードの解説と「ここがポイント!」

① `Application.ScreenUpdating = False` の魔法

Word VBAは、画面を書き換える処理に非常に大きなリソースを消費します。これを最初にオフにするだけで、処理速度が数倍から数十倍変わります。チーフアーキテクトとして、これは「必須の作法」だと断言します。

② `sec.Range` という考え方

セクションそのものには「段落」というプロパティが直接ぶら下がっているわけではありません。セクションの中にある「範囲(Range)」を指定し、その中にある `Paragraphs` を操作するのが正しい作法です。

③ 単位は「ポイント (pt)」

VBAで指定する数値は、基本的に「ポイント」です。

  • 1行 ≒ 12pt(フォントサイズによりますが、目安として)
  • もし「行」単位で指定したい場合は `LinesToPoints(1)` という関数を使うこともできますが、プロの現場では厳密なレイアウト管理のために数値(pt)で直接指定することが好まれます。

5. 陥りやすいエラーと回避策

罠1:セクション区切りがない文書

`ActiveDocument.Sections` は、セクション区切りを入れていない文書でも「1つ」存在します。そのため、コードが動かないことはありませんが、意図した分岐(Case 2など)を通らないことがあります。
対策: 「レイアウト」タブから「区切り」→「次のページから開始」を挿入して、セクションを明示的に分ける癖をつけましょう。

罠2:表(Table)の中の段落

このコードは、表の中にある段落にも影響を与えます。もし「表の中は変えたくない」という場合は、ループの中で `If p.Range.Information(wdWithInTable) = False Then` という条件分岐を追加してください。

結論:あなたが手に入れたのは「構造」を操る力

お疲れ様でした。今回のコードを理解できたなら、あなたは単に文字を装飾するレベルを超え、「文書の構造(セクション)」と「要素の書式(段落)」を切り離して制御するという、高度な設計思想の入り口に立っています。

Word VBAは、突き詰めれば「どの範囲(Range)の、どのプロパティを変えるか」の組み合わせに過ぎません。

ここから先は、フォントの色を変えたり、特定のスタイルが適用されている段落だけを狙い撃ちしたりと、自由自在にアレンジしてみてください。もし迷ったら、いつでもこの「構造を意識する」という基本に立ち返ってくださいね。

あなたの業務が、このコードで少しでも軽やかになることを願っています!

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