【入門編】【初心者向け】表の全セルに対して一括でフォントや段落設定を適用するツール – Word VBA解析バイブル

スポンサーリンク

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を自在に操ってください。

何か分からないことがあれば、いつでもまた聞きに来てくださいね。応援しています!

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