【Word VBA】数千行の表を一瞬で生成せよ。画面描画を支配する「高速化」の極意
こんにちは。現場で泥臭く、かつエレガントな自動化コードを追求しているエンジニアです。
皆さんが業務で「Wordの表に数千件のデータを流し込む」というタスクに直面したとき、マクロを実行して画面がカクカクと動き出し、数分間待ちぼうけを食らった経験はありませんか?
実は、Word VBAのパフォーマンスを決定づけるのは「コードの量」ではなく「Wordという巨大なDOM(ドキュメントモデル)とどう付き合うか」にあります。今日は、マクロの記録を卒業し、プロの領域へ踏み出すための「高速化の極意」を伝授します。
—
1. なぜ「画面描画」がボトルネックになるのか?
Word VBAで表を生成するとき、`Selection.InsertRows` や `Range.Text = “…”` を繰り返すと、Wordはその都度、画面上のレイアウトを再計算し、レンダリング(描画)を行おうとします。
数千行のループの中でこの処理が走ると、CPUとメモリは「表の更新」と「表示の更新」の板挟みになり、パフォーマンスが雪崩のように崩壊します。
私たちがすべきこと
それは、「Wordに、今の変更は全部終わるまで画面に反映しなくていいよ」と伝えることです。これが高速化の第一歩です。
—
2. 高速化の「黄金の三原則」
以下のテクニックをコードに組み込むだけで、実行速度は劇的に向上します。
1. `Application.ScreenUpdating = False`: 画面の更新を止め、Wordを「計算機」として専念させる。
2. `Application.Calculation = wdCalculationManual`: 再計算を停止する(複雑なフィールドコードがある場合に有効)。
3. オブジェクトの直接参照: `Selection`オブジェクトを使わない。`Range`を操作する。
—
3. 実践:爆速で表を生成するプロのコード
以下は、1,000行のデータを一瞬で流し込むためのテンプレートです。`Selection`を使わず、`Range`オブジェクトを直接操作するのがポイントです。
Sub GenerateFastTable()
Dim doc As Document
Dim tbl As Table
Dim rng As Range
Dim i As Long
Set doc = ActiveDocument
‘ — 高速化の魔法 —
Application.ScreenUpdating = False
‘ 新しい表を末尾に作成(列数3, 行数1)
Set rng = doc.Range
rng.Collapse Direction:=wdCollapseEnd
Set tbl = doc.Tables.Add(Range:=rng, NumRows:=1, NumColumns:=3)
‘ 見出しの設定
tbl.Cell(1, 1).Range.Text = “ID”
tbl.Cell(1, 2).Range.Text = “項目名”
tbl.Cell(1, 3).Range.Text = “値”
‘ データ流し込み(1000行の例)
For i = 1 To 1000
tbl.Rows.Add ‘ 行を追加
‘ セルへの書き込み(Selectionを使わずRangeに直接アクセス)
tbl.Cell(i + 1, 1).Range.Text = i
tbl.Cell(i + 1, 2).Range.Text = “データ-” & i
tbl.Cell(i + 1, 3).Range.Text = Int(Rnd 10000)
Next i
‘ — 高速化の解除 —
Application.ScreenUpdating = True
MsgBox “生成完了!これこそがプロの速度です。”
End Sub
—
4. なぜ `Selection` を使ってはいけないのか?
初学者が陥りやすい最大の罠が、`Selection.MoveDown` や `Selection.TypeText` です。
- `Selection` は「視覚的」な場所: 常にUI(ユーザーインターフェース)と同期しており、非常に低速です。
- `Range` は「論理的」な場所: ドキュメント内部のメモリ領域を直接指し示すため、UIの負荷を受けません。
「今どこが選択されているか」という情報を更新し続ける処理は、数千回繰り返せば大きなコストになります。可能な限り `Range` を使い、メモリ上で完結させましょう。
—
5. エラーを防ぐための「お約束」
コードをより堅牢にするために、以下のエラーハンドリングを必ず追加してください。
- 予期せぬ終了への備え: 途中でエラーが発生すると `ScreenUpdating = False` のままになり、Wordの画面が真っ白に固まったように見えます。必ず `On Error GoTo` でエラー発生時にも画面更新を再開する仕組みを入れてください。
On Error GoTo ErrorHandler
Application.ScreenUpdating = False
‘ … メイン処理 …
CleanExit:
Application.ScreenUpdating = True
Exit Sub
ErrorHandler:
MsgBox “エラー発生: ” & Err.Description
Resume CleanExit
—
最後に:ここをクリアすれば、あなたはもう初心者ではない
今回紹介した「画面描画の制御」と「Selectionからの脱却」は、Word VBAのパフォーマンスを語る上で欠かせない基礎教養です。
これらをマスターすれば、数万行の帳票作成も怖くありません。「Wordは遅い」というのは、実はコードの書き方次第なのです。さあ、次はあなたの業務で、この爆速ロジックを試してみてください。
質問があればいつでもどうぞ。あなたのコードが、さらに洗練されることを楽しみにしています!
