こんにちは。自動化の世界へようこそ。
Wordというツールは、多くの人にとって「文字を打つ場所」ですが、VBAを操るエンジニアにとっては「数千のオブジェクトが重なり合う広大なキャンバス」に他なりません。
今回は、実務で最も多くの人が苦しめられる「行間のズレ」を、VBAで一撃で制圧するテクニックを伝授します。「マクロの記録」を卒業し、プロの設計思想を身につける第一歩です。
—
なぜ「行間」を制御しなければならないのか?
Wordのデフォルト設定である「行間:1行」は、実は曲者です。
これはフォントサイズや環境によって微妙に挙動が変わる「相対的な値」だからです。結果として、文書ごとにレイアウトが微妙に崩れる……そんな経験はありませんか?
プロフェッショナルな文書作成では、行間を「固定値(pt)」で指定します。これにより、どのPCで開いても、どのフォントが混ざっても、段落の高さがミリ単位で揃います。これが「レイアウトを制する」ための鉄則です。
—
現場で使う「段落制御」の極意コード
まずは、現在開いている文書のすべての段落の行間を「18pt」に固定するコードを見てください。
Sub SetLineSpacingToFixed()
‘ 1. オブジェクトの定義
‘ Wordの階層構造: Application > Document > Paragraphs
Dim para As Paragraph
‘ 2. 画面更新を停止(高速化の必須テクニック)
Application.ScreenUpdating = False
‘ 3. 全段落をループ処理
For Each para In ActiveDocument.Paragraphs
‘ フォーマットオブジェクトにアクセス
With para.Format
‘ 行間を「固定値」に設定
.LineSpacingRule = wdLineSpaceExactly
‘ 固定値を18ポイントに設定
.LineSpacing = 18
End With
Next para
‘ 4. 画面更新を再開
Application.ScreenUpdating = True
MsgBox “レイアウトの統一が完了しました。”, vbInformation
End Sub
—
コードを読み解く:エンジニアの視点
このコードのどこが「プロの書き方」なのか。ポイントは3つです。
1. `Application.ScreenUpdating = False` の重要性
マクロを動かす際、画面がチカチカと切り替わるのを見たことがあるはずです。あれはWordが画面を描画し直している時間であり、プログラムの実行速度を劇的に低下させます。 処理の前後で更新を止めるのは、自動化エンジニアの嗜みです。
2. `wdLineSpaceExactly` という定数
「固定値」を意味するWord内部の定数です。これを知っているだけで、メニューを右クリックして「段落ダイアログ」を探す手間が不要になります。
3. `For Each` による反復処理
「段落の数だけ処理を繰り返す」という書き方です。インデックス(1, 2, 3…)を気にせず、すべての段落オブジェクトを「漏れなく、正しく」操作するための最も安全なイテレーション(繰り返し)手法です。
—
陥りやすい罠と対策
Q. 「マクロを動かしたのに反映されない箇所がある」
これは多くの場合、「スタイル」による上書きが原因です。
Wordには「標準」や「見出し1」といったスタイルがあり、段落の設定がそれらに強く固定されている場合があります。もしコードで変えられない箇所があれば、該当段落のスタイルを確認し、手動で一度解除するか、VBA側で `para.Style = wdStyleNormal` のように明示的にスタイルをリセットする処理を追加してみてください。
Q. 「エラーで止まってしまう」
`ActiveDocument` が開かれていない状態で実行するとエラーになります。
現場のコードでは `If Documents.Count = 0 Then Exit Sub` といったガード節(門番)を入れるのが、堅牢なプログラムを書くコツです。
—
次のステップへ
「行間」を操れるようになったあなたには、もう一段階上の景色が見えているはずです。次は「フォント設定」や「段落後の間隔(SpaceAfter)」を組み合わせて、完全に美しい文書テンプレートを一瞬で構築するマクロに挑戦してみてください。
Word VBAは、魔法ではありません。オブジェクトという名の「部品」を、正しく配置するパズルです。
もし分からないことがあれば、いつでも聞いてください。焦らず、一歩ずつ、その手で「動く自動化」を作り上げていきましょう。応援しています。
