ここでは 「配列に読み込んで高速化する方法」と「For Each を使う方法」 の
どちらを使うべきかを一目で判断できるまとめ を、初心者向けに解説します。
【結論】まずはこの早見表で判断!
| やりたいこと | 使うべき方法 | 理由 |
|---|---|---|
| 大量のセルを一括処理したい(数千~数十万セル) | 配列に読み込んで高速処理 | セルへのアクセスが激減し、10~100倍速くなる |
| セルやシートなど Excel オブジェクトを1つずつ扱いたい | For Each | コードが読みやすく、間違いが少ない |
| インデックス番号で処理を制御したい(偶数だけ・逆順など) | For i(従来のループ) | For Each はインデックスが直接取れない |
| 配列の中身を順に処理したい(少量) | For Each | 可読性が高い/配列のサイズが小さければ十分速い |
| ループ中に要素を追加・削除する必要がある | 配列 or For i | For 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
VB4. 配列 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
