Word VBAの「表」を支配せよ:全セル一括書式設定の極意
こんにちは。現場で泥臭い自動化を積み重ねてきたエンジニアです。
Word VBAを触り始めた皆さんが必ず一度は絶望するポイント。それが「表(Table)の操作」です。マクロの記録で生成されたゴミのようなコードに翻弄され、「なぜか行がズレる」「なぜか書式が変わらない」と悩んだことはありませんか?
今日は、そんな皆さんのために「表内の全セルに対して、一瞬で、かつ正確に書式を適用する」ための最高効率なアプローチを伝授します。これさえ理解すれば、Word VBAの「Rangeオブジェクトの概念」と「DOM操作の基礎」を完全に掌握したと言って過言ではありません。
—
1. なぜ「マクロの記録」ではダメなのか?
初心者の多くが陥る罠。それは「カーソルを動かして選択する」コードです。
‘ 【NGコード】やってはいけない書き方
Selection.Tables(1).Cell(1, 1).Select
Selection.Font.Name = “MS ゴシック”
このコードは、CPUにとっても人間にとっても非効率です。画面がパカパカと点滅し、処理速度は遅く、エラーも起きやすい。「選択(Select)」はWord VBAにおける最大の悪手です。
我々プロは「選択(Select)」せず、「操作対象(Range)」を直接掴みます。
—
2. 賢いエンジニアの「Range走査」術
Wordの表は、実は「Rangeオブジェクト」の集合体です。個々のセルをわざわざ選択しなくても、`Table.Range`を指定すれば、表全体を一つの塊として扱うことができます。
今回は、以下の手順で「表内の全セル」をスマートに処理します。
1. ターゲットの表を特定する
2. `Cell.Range`をループで回す
3. 書式を「上書き」ではなく「統一」する
実装コード:全セル一括書式設定ツール
このコードを標準モジュールに貼り付けてみてください。
Sub FormatAllCellsInTable()
Dim tbl As Table
Dim cel As Cell
‘ アクティブドキュメントの最初の表を対象にする
If ActiveDocument.Tables.Count = 0 Then
MsgBox “表が見つかりません。”
Exit Sub
End If
Set tbl = ActiveDocument.Tables(1)
‘ 画面更新を停止(高速化の鉄則!)
Application.ScreenUpdating = False
‘ 表内の全セルを走査
For Each cel In tbl.Range.Cells
‘ セルごとのRangeを取得して書式を適用
With cel.Range
.Font.Name = “MS ゴシック”
.Font.Size = 10
.ParagraphFormat.Alignment = wdAlignParagraphCenter ‘ 中央揃え
.ParagraphFormat.LineSpacingRule = wdLineSpaceSingle ‘ 行間を固定
End With
Next cel
‘ 画面更新を再開
Application.ScreenUpdating = True
MsgBox “全セルの書式を統一しました!”
End Sub
—
3. このコードが「プロ仕様」である理由
① `ScreenUpdating = False` の恩恵
Word VBAは画面描画に非常にリソースを使います。この一行をコードの前後に入れるだけで、処理速度が体感で数倍変わります。
② `For Each` の美学
`For i = 1 To tbl.Rows.Count` のようにインデックスを回すと、セルの結合がある場合にエラー(実行時エラー 5941)が出やすくなります。`For Each` を使えば、結合されていようが、複雑なレイアウトであろうが、Wordが認識している「全セル」を漏れなく巡回できます。
③ 「Range」という概念
`cel.Range` は、そのセルの中身すべてを指し示します。ここに対して `With` 構文で一気に属性を書き込む。これが最もメモリ効率が良く、安定した書き方です。
—
4. 陥りやすいエラーと対策
- 「実行時エラー 5941:要求されたメンバーはコレクションにありません」
- 原因:結合されたセルがあるのに、行数・列数を決め打ちでループしようとしています。
- 対策:上記コードのように `For Each cel In tbl.Range.Cells` を使えば、結合があっても自動的にスキップして処理してくれるため、このエラーは発生しません。
- 書式が反映されない
- 原因:スタイルが優先されている可能性があります。
- 対策:もしスタイルを完全にリセットしたい場合は、ループ内で `.Style = wdStyleNormal` を実行してから個別のフォント設定を行うと確実です。
—
最後に:ここをクリアすれば、あなたはもう初心者ではない
表の全セルを自在に操れるようになったということは、「Wordの内部構造をRangeという視点で理解した」ということです。これができれば、特定の文字列を探して色を変える、特定の条件でセルの背景色を塗りつぶす、といった高度な自動化への扉が開かれます。
「マクロの記録」という補助輪は外しました。これからは、あなたのコードでWordを自在に操ってください。
何か分からないことがあれば、いつでもまた聞きに来てくださいね。応援しています!
