こんにちは! Wordでの資料作り、本当にお疲れ様です。
「よし、きれいにレイアウトできたぞ」と思って印刷プレビューを見たら、見出しだけが前のページの最後にポツンと残って、肝心の本文が次のページにいっている……。
ビジネス文書やマニュアル作成で、この「意図しない不格好な改ページ」にイライラさせられた経験はありませんか?
Wordには、これを防ぐために「次と分離しない(Keep with next)」という神機能があります。段落書式の「改ページと改行」タブにあるあれです。
ただ、この設定、文書全体で何十個もある見出しに対して、一つひとつマウスでカチカチ設定していくのは、ハッキリ言って苦行ですよね。
そこで今回は、マクロの記録から一歩抜け出して「実務で即戦力になるWord VBA」を学ぶ第一歩として、文書全体(または選択範囲)の「次と分離しない」を一括でON/OFF(トグル切り替え)する魔法のツールを一緒に作ってみましょう!
ここをクリアすれば、Word VBAの基本はバッチリですよ。優しく丁寧に解説していきますので、ぜひついてきてくださいね。
—
1. なぜWord VBAで自動化するのか?(本質を知る)
Wordは、Excelと違って「文字の流し込み(リフロー)」が常に行われているドキュメントです。そのため、ちょっと文字を追加しただけで全体のレイアウトがガラリと変わってしまいます。
見出しと次の段落がバラバラにならないようにする「次と分離しない」設定は、美しいドキュメントを作るための必須マナーです。しかし、これを手動ですべての段落に適用するのは、エンジニアの仕事ではありません。「人間はクリエイティブな思考に集中し、単純作業はコードに任せる」。これが業務自動化の鉄則です。
Word VBAでは、段落(`Paragraph`)というオブジェクトをループで総舐めにし、そのプロパティを書き換えるだけで、一瞬で文書全体の書式をコントロールできます。
—
2. 完成版コード:一括トグルツール
まずは、何も考えずにそのままコピペして使える完成版のコードをプレゼントします。
開発タブのVBE(Visual Basic Editor)を開き、標準モジュールにペーストしてください。
Sub ToggleKeepWithNext()
‘ 変数の宣言
Dim targetRange As Range
Dim p As Paragraph
Dim settingStatus As Long
Dim msg As String
‘ 1. 処理対象をユーザーに選んでもらう(選択範囲か、文書全体か)
If Selection.Type = wdSelectionIP Then
‘ カーソルだけの場合は文書全体を対象にする
Set targetRange = ActiveDocument.Content
msg = “文書全体の「次と分離しない」設定を切り替えますか?”
Else
‘ 文字が選択されている場合は選択範囲を対象にする
Set targetRange = Selection.Range
msg = “選択範囲の「次と分離しない」設定を切り替えますか?”
End If
‘ 2. 実行確認のメッセージボックス
If MsgBox(msg & vbCrLf & “※現在の状態を反転(トグル)させます。”, vbYesNo + vbQuestion, “一括設定ツール”) = vbNo Then
Exit Sub
End If
‘ 3. 効率化のため、画面描画を停止して爆速化する
Application.ScreenUpdating = False
‘ 4. 対象範囲内の最初の段落の状態を見て、全体のON/OFFを決める(トグル方式)
‘ ※最初の段落がONなら全体をOFFに、OFFなら全体をONにする
If targetRange.Paragraphs(1).KeepWithNext = wdToggle Then
settingStatus = False
Else
‘ ここではシンプルに「ON(True)」に統一して設定する例にします
settingStatus = True
End If
‘ 5. ループを回して、すべての段落に設定を適用
For Each p In targetRange.Paragraphs
‘ テーブル内の段落などでエラーが出ないよう念のためガード
On Error Resume Next
p.KeepWithNext = settingStatus
On Error GoTo 0
Next p
‘ 6. 画面描画を復元
Application.ScreenUpdating = True
‘ 7. 完了通知
MsgBox “処理が完了しました!”, vbInformation, “完了”
End Sub
—
3. 初心者でも安心!コードのポイント解説
このコードには、プロのエンジニアが現場で使う「ちょっとしたテクニック」がさりげなく組み込まれています。重要なポイントを3つに絞って解説しますね。
① 選択範囲と文書全体の「自動判定」
If Selection.Type = wdSelectionIP Then
Set targetRange = ActiveDocument.Content
Else
Set targetRange = Selection.Range
End If
- ここがポイント!
ユーザーが文書の一部を選択していれば「その部分だけ」、ただカーソルを置いているだけなら「文書全体」を対象にするという、「親切設計」にしています。VBAの `Selection.Type = wdSelectionIP` は、「文字が選択されておらず、カーソルが点滅しているだけの状態か?」を判定するお馴染みのテクニックです。
② 画面描画の停止(`Application.ScreenUpdating = False`)
- ここがポイント!
ページ数が何百ページもある分厚いWord文書でこれを実行すると、画面がチラつき、処理にもの凄く時間がかかります。`ScreenUpdating = False` を挟むことで、バックグラウンドで高速に処理を終わらせることができます。大規模文書を扱うWord VBAでは必須の作法です。
③ エラーハンドリングの重要性(`On Error Resume Next`)
- ここがポイント!
Word文書には、文章だけでなく「表(テーブル)」が含まれていることが多いです。表の中の段落に対して、プロパティの種類によってはエラーを吐くことがあります。そのため、一時的にエラーを無視して次の処理に進むおまじない(`On Error Resume Next`)を入れることで、途中でマクロが強制終了するのを防いでいます。
—
4. 実際に動かしてみよう(使い方)
1. Wordを開き、`[Alt] + [F11]` キーを押してVBE(VBAの開発画面)を開きます。
2. メニューの `[挿入]` > `[標準モジュール]` をクリックします。
3. 開いた白い画面に、先ほどのコードを貼り付けます。
4. Wordの画面に戻り、`[Alt] + [F8]` キーを押して `ToggleKeepWithNext` を選択し、「実行」をクリック!
これだけで、文書全体の「次と分離しない」設定が一発で切り替わります。クイックアクセスツールバーにこのマクロを登録しておけば、ワンクリックでいつでも呼び出せる最強の相棒になりますよ。
—
おわりに
いかがでしたでしょうか?
「次と分離しない」という一見地味な設定も、VBAのオブジェクト操作と組み合わせることで、日々の面倒なレイアウト調整を秒速で終わらせる強力な自動化ツールに生まれ変わります。
Word VBAは、Excel VBAに比べて情報が少ないと言われがちですが、文書構造を理解すれば驚くほど自由自在に操れるようになります。
「ここをこう変えたいんだけど、どうすればいい?」といった疑問があれば、ぜひ先輩エンジニアの私に気軽に聞いてくださいね。あなたの自動化ライフを心から応援しています!
