【入門編】【上級者向け】大量の表を扱う際、画面更新を停止して処理速度を劇的に向上させる最適化 – Word VBA解析バイブル

スポンサーリンク

こんにちは!Word VBAの世界へようこそ。
マクロの記録ボタンを押して、カチカチと図形や表をいじっていた時期から、一歩先へ進みたいあなたへ。

今回は、Word VBAにおいて「数千行の表を扱うプロの現場」で絶対に使われる、極限のパフォーマンス最適化手法についてお話しします。

「Excelのマクロは速いのに、Wordで表を作ると画面がカクカクして、終わるまでに何分もかかる……」
そんな絶望を味わったことはありませんか?

大丈夫。ここをクリアすれば、あなたもWordの裏側を完全に掌握するプロフェッショナルです。優しく、そして本質的なところまで深く解説していきますね。

—

なぜWordの表操作は遅いのか?(根本原因の理解)

まず、Wordのアーキテクチャ(構造)を知ることから始めましょう。

Excelは「セル」という独立したデータの集合体であり、メモリ上で計算を完結させやすい仕組みになっています。一方、Wordの本質は「連続するテキストのストリーム(流れ)」です。

Wordで表(Table)を操作するとき、VBAで1行追加したり、セルに文字を流し込んだりするたびに、Wordは律儀にこんな作業を行っています。

1. レイアウトの再計算(Page Layout Engineの稼働): 「行が増えたから、改ページの位置が変わるか?」を毎回の操作で計算し直す。
2. 画面描画の更新(GUI Refresh): 人間の目に見えるように、画面上のピクセルを必死に書き換える。

数千行の表を作るループの中でこれをやるとどうなるか?
コンピュータの大半のパワーが「文字を書くこと」ではなく「画面を塗り直すこと」に消費されてしまい、処理が極端に重くなるのです。

—

解決策:描画を止め、すべてをメモリ上で完結させる

この無駄なオーバーヘッドを消し去る魔法が、今回紹介する「画面更新とイベントの完全停止(ScreenUpdating & DisplayAlertsの制御)」です。

さらに、プロの現場では `Selection`(選択範囲)を絶対に使いません。画面上のカーソルを動かすのではなく、見えないメモリ上でオブジェクト(Range)を直接操作する。これらを組み合わせることで、処理速度を最大で数十倍〜数百倍に跳ね上げることができます。

図解的イメージ

  • 素人コード(遅い):

`[行追加] =(画面をチラッ!再計算)=> [文字入力] =(画面をチラッ!再計算)=> [行追加] … (∞ 1000回)`

  • プロのコード(爆速):

`[画面停止] ➔ [見えない世界で1000行一気に構築] ➔ [画面再開] (一瞬で完了!)`

—

実践!数千行の表を爆速生成するプロフェッショナル・コード

それでは、実際に開発の現場でそのままコピペして使えるサンプルコードを見ていきましょう。
今回は、ドキュメントの末尾に「3000行のデータ表」を瞬時に生成するプロシージャを書きました。

Sub CreateLargeTableHighSpeed()
Dim startTime As Double
startTime = Timer ‘ 処理時間計測用

‘ ==========================================
‘ 1. 最重要:パフォーマンスを劇的に上げる設定
‘ ==========================================
With Application
.ScreenUpdating = False ‘ 画面描画の完全停止
.DisplayAlerts = wdAlertsNone ‘ 警告メッセージの抑制
.Optimization = True ‘ Word内部の最適化モードをON(※注意点あり)
End With

‘ ステータスバーに進捗を表示(ユーザーへの配慮もプロの証)
Application.StatusBar = “大量の表データを構築中です。しばらくお待ちください…”

Dim doc As Document
Set doc = ActiveDocument

‘ ==========================================
‘ 2. 見えないRangeオブジェクトで表を生成
‘ ==========================================
‘ 文書の末尾に表を挿入するための基準点(Range)を取得
Dim rng As Range
Set rng = doc.Content
rng.Collapse wdCollapseEnd

Dim totalRows As Long
totalRows = 3000 ‘ 生成する行数

Dim targetTable As Table
‘ 3000行 × 3列 の表を一気に作成
Set targetTable = doc.Tables.Add(Range:=rng, NumRows:=totalRows, NumColumns:=3)

‘ 表の基本設定(デザインの固定など)
targetTable.Borders.Enable = True
targetTable.AllowAutoFit = False

‘ ==========================================
‘ 3. セルへのデータ流し込み(高速ループ)
‘ ==========================================
Dim i As Long
Dim cellRng As Range

‘ ※画面描画が止まっているため、Cell.Range.Textへの代入が爆速で行われます
For i = 1 To totalRows
‘ 1列目:行番号
targetTable.Cell(i, 1).Range.Text = “ID-” & Format(i, “0000”)

‘ 2列目:サンプルテキスト
targetTable.Cell(i, 2).Range.Text = “項目データ ” & i

‘ 3列目:数値データ
targetTable.Cell(i, 3).Range.Text = Format(i 123.45, “#,

0.00″)

Next i

‘ ==========================================
‘ 4. 必ず元の状態に戻す(超重要!)
‘ ==========================================
With Application
.ScreenUpdating = True
.DisplayAlerts = wdAlertsAll
.Optimization = False
End With

Application.StatusBar = False ‘ ステータスバーをリセット

‘ 完了メッセージ
MsgBox “処理が完了しました!” & vbCrLf & _
“処理時間: ” & Format(Timer – startTime, “0.00”) & ” 秒”, _
vbInformation, “高速化完了”
End Sub

—

コードの解説と「知られざる罠」

ここからは、コードの深掘りと、初心者が絶対にハマる「罠」について解説します。

1. `ScreenUpdating = False` の魔力

これを記述することで、Wordは「ユーザーに見せるための画面書き換え」を一切放棄し、メモリ内での計算だけに集中します。数千回のループ処理を行うマクロでは、これがないと毎回ウインドウがチラつき、最悪の場合はフリーズしたように見えます。

2. `Application.Optimization = True` の諸刃の剣

Word VBAには、隠し球のようなプロパティとして `Optimization` が存在します。これを `True` にすると、Wordはメモリ消費を抑えて爆速モードに入ります。
ただし、エラーハンドリングを怠ると、マクロが途中で異常終了した際に Word 自体が不安定になるリスクがあります。そのため、必ず後述する「エラー対策」とセットで覚えてください。

3. 【超重要】「後始末」を忘れないことの恐怖

もし、コードの途中でエラーが発生し、`ScreenUpdating = False` や `Optimization = True` が解除されないままマクロが停止したらどうなるでしょうか?
画面が真っ白なまま固まったり、Wordの動作がおかしくなり、タスクマネージャーから強制終了するハメになります。

プロのエンジニアは、必ず「エラーが起きても確実に設定を戻す仕組み(Error Handler)」を実装します。

—

現場で使える!「確実な後始末」を入れた完全版テンプレート

先ほどのコードを、より実務で耐えうる堅牢な形にブラッシュアップしましょう。`On Error GoTo` を使って、どんな例外が発生しても必ず設定が元に戻るようにします。

Sub CreateLargeTableSafe()
Dim startTime As Double
startTime = Timer

‘ エラーハンドラーの有効化
On Error GoTo ErrorHandler

‘ === パフォーマンス最適化の開始 ===
Application.ScreenUpdating = False
Application.DisplayAlerts = wdAlertsNone
Application.Optimization = True

‘ — ここからメインの処理 —
Dim doc As Document
Set doc = ActiveDocument

Dim rng As Range
Set rng = doc.Content
rng.Collapse wdCollapseEnd

Dim totalRows As Long
totalRows = 3000

Dim targetTable As Table
Set targetTable = doc.Tables.Add(Range:=rng, NumRows:=totalRows, NumColumns:=3)

Dim i As Long
For i = 1 To totalRows
targetTable.Cell(i, 1).Range.Text = “ID-” & i
targetTable.Cell(i, 2).Range.Text = “テストデータ ” & i
targetTable.Cell(i, 3).Range.Text = i 10
Next i
‘ — メイン処理ここまで —

CleanUp:
‘ === 必ず実行される後始末(正常系・異常系共通) ===
Application.ScreenUpdating = True
Application.DisplayAlerts = wdAlertsAll
Application.Optimization = False
Application.StatusBar = False

MsgBox “処理完了! 経過時間: ” & Format(Timer – startTime, “0.00”) & “秒”, vbInformation
Exit Sub

ErrorHandler:
‘ エラー発生時の緊急脱出ルート
MsgBox “エラーが発生しました: ” & Err.Description, vbCritical, “異常終了”
Resume CleanUp ‘ 必ずCleanUpラベルに飛んで設定を戻す
End Sub

この `CleanUp` パターンを身につけておけば、どんなに複雑なWordの大量データ処理を任されても、システムを壊すことなく安心してコードを動かすことができます。

—

まとめ:ここをクリアすれば、Word VBAは怖くない!

今回は、大量の表を扱う際の画面更新停止とパフォーマンス最適化について解説しました。

1. Wordの遅さの原因は「画面描画」と「レイアウト再計算」にある。
2. `ScreenUpdating = False` と `Optimization = True` で描画を断つ。
3. `Selection` を使わず、`Range` オブジェクトで裏側からスマートに操作する。
4. `On Error GoTo` を使った確実な設定の復旧(後始末)を忘れない。

この4つをマスターしたあなたは、もはや「マクロの記録をいじっている初心者」ではありません。立派なWord VBAエンジニアです。

日々の煩雑なドキュメント作成作業を、あなたの書いた洗練されたコードで一瞬にして終わらせてやりましょう。それでは、次のステージでお会いしましょう!

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