Excel VBA | 「配列に読み込んで高速化する方法」と「For Each を使う方法」 の使い分け

VBA
スポンサーリンク

ここでは 「配列に読み込んで高速化する方法」と「For Each を使う方法」
どちらを使うべきかを一目で判断できるまとめ を、初心者向けに解説します。


【結論】まずはこの早見表で判断!

やりたいこと使うべき方法理由
大量のセルを一括処理したい(数千~数十万セル)配列に読み込んで高速処理セルへのアクセスが激減し、10~100倍速くなる
セルやシートなど Excel オブジェクトを1つずつ扱いたいFor Eachコードが読みやすく、間違いが少ない
インデックス番号で処理を制御したい(偶数だけ・逆順など)For i(従来のループ)For Each はインデックスが直接取れない
配列の中身を順に処理したい(少量)For Each可読性が高い/配列のサイズが小さければ十分速い
ループ中に要素を追加・削除する必要がある配列 or For iFor Each は要素の変更に弱い
セル範囲のように「まとまり」を直感的に回したいFor Eachコードが短くなる

1. 配列高速化が向いているケース

大量データ(数千〜数十万セル)の処理

  • セルへ直接アクセスすると 激遅(Excel に毎回命令が行くため)
  • 配列なら 一度にメモリに読み込んで、内部処理できる

典型例

  • 10,000 行の数値に一括計算
  • 大量データの置換
  • 2列または多列の集計
  • 条件に応じて値を書き換える処理

高速コードのパターン

Dim arr As Variant
arr = Range("A1:C50000").Value

' 配列で爆速処理
For i = 1 To UBound(arr, 1)
    If arr(i, 1) > 0 Then
        arr(i, 2) = arr(i, 2) * 2
    End If
Next i

Range("A1:C50000").Value = arr
VB

効果:数十倍の高速化

遅いコードが「数秒 → 0.02秒」などになることも。


2. For Each が向いているケース

Excel のオブジェクトを順に処理したいとき

  • Range の各セル
  • Worksheets の各シート
  • Charts の各チャート
  • Shapes の各図形

Excel の「オブジェクトコレクション」を扱うなら For Each は最強

例:シート名をすべて出力

Dim ws As Worksheet
For Each ws In Worksheets
    Debug.Print ws.Name
Next
VB

例:選択範囲の色を全部赤に

Dim c As Range
For Each c In Selection
    c.Interior.Color = vbRed
Next
VB

シンプルで読みやすい

オブジェクトを扱う時は For Each の方がほぼ常に安全で直感的


3. For Each の弱点(配列に向いていないポイント)

弱点解説
インデックス番号が直接取れない「2番目だけ処理したい」などが書きにくい
ループ中に要素を増減すると不安定コレクションを書き換えるとエラーになりやすい
配列処理は For i の方が速く書きやすい2次元配列は特に For i の方が扱いやすい

例:偶数番目だけ処理したい

' For Each では困難
For i = 1 To UBound(arr)
    If i Mod 2 = 0 Then
        arr(i) = arr(i) * 2
    End If
Next
VB

4. 配列 vs For Each:具体的な比較例

セル10000個の数値をすべて2倍にする

① For Each(遅い)

For Each c In Range("A1:A10000")
    c.Value = c.Value * 2
Next
VB

② 配列(速い)

arr = Range("A1:A10000").Value
For i = 1 To UBound(arr)
    arr(i,1) = arr(i,1) * 2
Next i
Range("A1:A10000").Value = arr
VB

→ 配列の方が10〜20倍速い。
場合によっては100倍。


最終的な使い分けガイド(簡易フローチャート)

大量セルを処理したい? ---- Yes → 配列で高速化
           ↓ No
Excelのオブジェクトを順に触りたい? ---- Yes → For Each
           ↓ No
要素番号を使いたい?(偶数だけ、逆順など) ---- Yes → For i
           ↓ No
要素数が少なく読みやすさを優先? ---- Yes → For Each

まとめ(覚えておけばOK)

  • 大量セル → 配列(高速)
  • Excel オブジェクト → For Each(直感的で安全)
  • 番号ベースの制御 → For i
  • 読みやすさ優先 & 少量データ → For Each
VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました