こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して「なんだかよく分からないけれど動いたぞ」というフェーズを抜け出し、自分の手でドキュメントを意のままにコントロールしたいあなたへ。
今回は、実務で本当によく遭遇する「段落間の余白をミリ単位で厳密に制御する」というテーマについて、徹底的に解説していきます。
「社内規定のフォーマットに合わせるために、全ページの段落前後の空きをチマチマ手動で直している……」
そんな不毛な作業とは、今日で完全にオサラバしましょう。ここをクリアすれば、Word VBAの「段落(Paragraph)と書式」の基本はバッチリです!
—
なぜ「Enterキーの連打」ではなくVBAなのか?
ドキュメントを作っていて、段落の間隔をあけたいとき、ついつい「Enterキー」を2回叩いていませんか?
プロのエンジニアの視点から言わせてもらうと、これは「絶対にやってはいけない禁忌(アンチパターン)」です。
なぜなら、Wordの本質は「構造化されたテキスト」であり、空行は「意味のない空の段落」というゴミを生み出すことになってしまうからです。後からページレイアウトが変わったとき、レイアウトが崩れて発狂することになります。
正しいアプローチは、Wordが持つ「段落前(SpaceBefore)」と「段落後(SpaceAfter)」というプロパティをプログラムから直接叩くこと。これにより、文書の構造を汚さず、美しく厳密な余白コントロールが可能になります。
—
押さえておくべき「単位」の罠:ポイントとミリの換算
ここで、Word VBAを学ぶ誰もが最初にハマる罠についてお話しておきます。
Wordの内部世界では、フォントサイズや余白の指定は「ポイント(pt)」という単位で管理されています。しかし、私たちの現実世界の社内規定は「段落の間隔は 5mm あけること」のように「ミリ(mm)」で指定されていますよね。
「じゃあ、VBAで `SpaceBefore = 5mm` なんて書けるの?」
答えは NO です。VBAは「mm」という単位をそのままでは理解できません。
ここで、プロのエンジニアが使っている魔法の換算式を伝授しましょう。
> 1ミリ ≒ 2.835 ポイント (厳密には 1インチ = 25.4mm = 72pt なので、 72 ÷ 25.4 ≒ 2.83465…)
つまり、社内規定で「段落の後に 6mm の余白をあけたい」と思ったら、VBAにはこう指示する必要があります。
- $6 \text{ mm} \times 2.835 \fallingdotseq 17.0 \text{ pt}$
この換算のひと手間を入れるだけで、あなたのマクロは「ただ動くもの」から「実務で使えるプロ品質のもの」へと一気に昇華します。
—
実践!ミリ単位で段落余白を制御するマクロ
それでは、実際に動かせる実用コードを公開します。
今回は、アクティブな文書全体(または選択範囲)のすべての段落に対して、「段落前を 3mm」「段落後を 6mm」に一括設定するスクリプトです。
VBAエディタ(Alt + F11)を開き、標準モジュールに以下のコードを貼り付けてみてください。
Sub SetParagraphSpacingInMillimeters()
‘ 変数の宣言
Dim targetDoc As Document
Dim p As Paragraph
‘ 設定したいミリ数(ここに社内規定の値を入力します)
Dim mmBefore As Single
Dim mmAfter As Single
mmBefore = 3# ‘ 段落前:3mm
mmAfter = 6# ‘ 段落後:6mm
‘ ミリをWord内部の単位である「ポイント」に変換する
‘ 係数:72ポイント / 25.4ミリ ≒ 2.83465
Dim ptBefore As Single
Dim ptAfter As Single
ptBefore = mmBefore (72 / 25.4)
ptAfter = mmAfter (72 / 25.4)
‘ 処理対象のドキュメントを明確に定義(アクティブドキュメント)
Set targetDoc = ActiveDocument
‘ 画面のちらつきを抑えて処理を高速化するプロの技
Application.ScreenUpdating = False
‘ 文書内のすべての段落をループ処理
For Each p In targetDoc.Paragraphs
‘ 段落前後のスペースを設定
p.SpaceBefore = ptBefore
p.SpaceAfter = ptAfter
‘ ついでに行間を「固定値」ではなく「1.15行」などにしたい場合はここをいじる
‘ p.LineSpacingRule = wdLineSpaceMultiple
‘ p.LineSpacing = LinesToPoints(1.15)
Next p
‘ 画面描画を再開
Application.ScreenUpdating = True
‘ 完了メッセージ
MsgBox “段落の余白調整が完了しました!”, vbInformation, “一括処理ツール”
End Sub
—
