Excel VBA | 実務で役立つ「配列に読み込んで一度に書き戻す」高速化テクニック

VBA
スポンサーリンク

Excel VBA でセルを 1つずつ処理すると遅い のはよくある悩みです。
原因は「セルへのアクセスが都度 Excel に問い合わせる」ため。これを改善する方法が 配列にまとめて読み込み → VBA内で処理 → 一括で書き戻す という流れです。


基本の流れ

  1. セル範囲を配列に読み込む
    Range.Value を配列に代入すると、二次元配列として取得できる。
  2. 配列内で処理する
    VBA内で高速にループできる。
  3. 処理済み配列を一括でセルに書き戻す
    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

✅ まとめ

  • セルを直接ループ → 遅い
  • 配列に読み込んで処理 → 一括書き戻し → 爆速
  • 実務では「数千行の売上データ」「顧客リスト」「在庫表」などで効果絶大。
タイトルとURLをコピーしました