Excel VBA でセルを 1つずつ処理すると遅い のはよくある悩みです。
原因は「セルへのアクセスが都度 Excel に問い合わせる」ため。これを改善する方法が 配列にまとめて読み込み → VBA内で処理 → 一括で書き戻す という流れです。
基本の流れ
- セル範囲を配列に読み込む
Range.Value を配列に代入すると、二次元配列として取得できる。 - 配列内で処理する
VBA内で高速にループできる。 - 処理済み配列を一括でセルに書き戻す
Range.Value に配列を代入すれば一度で反映される。
実装例:売上データに消費税を加算
シナリオ: D2:D100 の金額に消費税 10% を加算して更新する。
Sub AddTaxFast()
Dim arr As Variant
Dim i As Long
' 1. 範囲を配列に読み込む
arr = Range("D2:D100").Value
' 2. 配列内で処理(1次元目: 行, 2次元目: 列)
For i = 1 To UBound(arr, 1)
If IsNumeric(arr(i, 1)) And arr(i, 1) <> "" Then
arr(i, 1) = arr(i, 1) * 1.1
End If
Next i
' 3. 一括で書き戻す
Range("D2:D100").Value = arr
End Sub
VB効果
- 従来の方法(セルを1つずつ処理)
→ 100行でも「遅い」と感じることがある。 - 配列方式
→ 数千行でも一瞬で処理できる。
応用例
- 大量データの加工(売上、在庫、顧客リストなど)
- 条件付き整形(空白セルを塗る、閾値以上を赤字にする)
- 複数列の同時処理(例: 単価×数量=金額を計算)
例:複数列を計算して「金額列」を作る
Sub CalcAmount()
Dim arr As Variant
Dim i As Long
' 単価(B列)と数量(C列)から金額(D列)を計算
arr = Range("B2:D100").Value
For i = 1 To UBound(arr, 1)
If IsNumeric(arr(i, 1)) And IsNumeric(arr(i, 2)) Then
arr(i, 3) = arr(i, 1) * arr(i, 2)
End If
Next i
Range("B2:D100").Value = arr
End Sub
VB✅ まとめ
- セルを直接ループ → 遅い
- 配列に読み込んで処理 → 一括書き戻し → 爆速
- 実務では「数千行の売上データ」「顧客リスト」「在庫表」などで効果絶大。

