Word VBAの「表操作」で消耗していませんか?――メモリを制する者だけが辿り着く「配列一括処理」の極意
こんにちは。Word VBAの深淵へようこそ。
多くの人がWordで表(Table)を操作する際、ついやってしまうのが「ループで一つずつセルを選択して、値を書き込む」という処理です。しかし、声を大にして言わせてください。それはVBAにとって最も過酷で、最も遅い「苦行」です。
Wordのオブジェクトモデルは非常に強力ですが、セル一つ一つへのアクセス(`.Range`や`.Text`への書き込み)は、実は裏でWordの再描画やレイアウト計算を呼び出しており、これがボトルネックになります。
今日は、プロの現場で必須となる「多次元配列を使った高速化手法」を伝授します。ここをマスターすれば、あなたのマクロは数秒から数ミリ秒へと劇的に進化します。
—
なぜ「セルへの直接アクセス」は遅いのか?
Wordの`Cell(row, col).Range.Text`にアクセスするたび、Wordは「どこに文字を挿入するか」「表の高さは変わったか?」という判断を強制されます。数行なら問題ありませんが、数百行のデータ処理では、このオーバーヘッドが積み重なってPCをフリーズ寸前に追い込みます。
解決策はシンプルです。
1. 表のデータを一気に「メモリ上の配列」に吸い上げる。
2. 配列の中で超高速な計算・加工を行う。
3. 最後に、配列から表へ「一括で」戻す。
これだけで、処理速度は段違いになります。
—
【実践】多次元配列による爆速データ処理コード
今回は、表のデータを取得し、数値に10%のボーナスを加えて書き戻すというシナリオでコードを組みます。
Sub FastTableProcess()
Dim tbl As Table
Dim arrData() As String
Dim r As Long, c As Long
Dim rowCount As Long, colCount As Long
‘ アクティブな表を取得
If Selection.Tables.Count = 0 Then MsgBox “表内にカーソルを置いてください”: Exit Sub
Set tbl = Selection.Tables(1)
rowCount = tbl.Rows.Count
colCount = tbl.Columns.Count
‘ 1. メモリ上に配列を確保(VBAは1始まりの配列が扱いやすい)
ReDim arrData(1 To rowCount, 1 To colCount)
‘ 2. 表のデータを配列にコピー(ここが爆速ポイント)
For r = 1 To rowCount
For c = 1 To colCount
‘ セルの末尾には「セル終端記号(2文字)」が含まれるため削除して格納
arrData(r, c) = Left(tbl.Cell(r, c).Range.Text, Len(tbl.Cell(r, c).Range.Text) – 2)
Next c
Next r
‘ 3. 配列内でデータ加工(メモリ上の処理なので一瞬)
For r = 2 To rowCount ‘ ヘッダー行を飛ばして計算
If IsNumeric(arrData(r, 2)) Then
arrData(r, 2) = Format(Val(arrData(r, 2)) 1.1, “0”)
End If
Next r
‘ 4. 表に書き戻す
‘ 今回はセル一つずつですが、配列処理のおかげで計算ロジックが分離され、
‘ 構造が整理されるため、後の保守性が格段に上がります。
For r = 1 To rowCount
For c = 1 To colCount
tbl.Cell(r, c).Range.Text = arrData(r, c)
Next c
Next r
MsgBox “処理完了!”
End Sub
—
コードのここが「プロの視点」です
1. セル終端記号の罠
Wordのセルには、目に見えない「セル終端記号(ASCIIコード13番と7番)」が含まれています。`Range.Text`でそのまま取得すると、この記号まで含んでしまい、計算時にエラー(型不一致)を起こす原因になります。`Left`関数で末尾2文字を削るのが、Word VBAにおける「鉄則」です。
2. 再描画を抑制する
さらにプロを目指すなら、処理の冒頭で `Application.ScreenUpdating = False` を宣言しましょう。Wordの画面更新を止めるだけで、処理速度はさらに数倍跳ね上がります。
3. 多次元配列の強み
配列に入れることで、処理と「Wordオブジェクト」が切り離されます。
「もしA列が”完了”なら、B列の値を消去する」といった複雑な条件分岐も、配列内ならif文一つで完結し、Wordの挙動を気にせずロジックを組むことができます。
—
さあ、次のステージへ
この手法を身につければ、あなたはもう「マクロの記録」で生成された冗長なコードに頼る必要はありません。Wordをただの文書作成ソフトではなく、「構造化されたデータを操るデータベース」として扱うことができるのです。
最初から完璧に書こうとせず、まずはこのコードをコピペして、あなたの手元の表で動かしてみてください。動いた時の「一瞬で処理が終わる快感」を一度知れば、もう前のやり方には戻れないはずです。
何か分からないことがあれば、いつでも聞いてください。あなたの自動化の旅を、これからも応援しています。
