ここでは 「Cells を使った高速化(配列 × 自動範囲)」の入門版 を、初心者向けに “なぜ速いのか” までかみ砕いて解説します。
実務で 1,000 行 → 1 秒未満、10 万行でも一気に処理できる高速テクニックです。
結論:高速化のコアは「まとめて読み → まとめて書き戻す」
Excel は
- シートへ 1 回書く
だけでも、裏で“大量の処理”が走ります。
だから、
❌ Cells(i, j).Value = ... を1万回
→ めちゃくちゃ遅い
(実務では 30 秒〜数分かかるケースも)
正しい高速化の考え方
- Range 全体を一気に配列に読み込む
- 配列の中で高速処理(超速い)
- Range に一気に書き戻す(1 回で OK)
これで 100〜1000 倍速くなります。
ステップ1:自動でデータ範囲を検出する
まずは Cells を使った“自動最終行検出” を行う。
Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
VBA列を基準に、値がある最後の行を取ります。
ステップ2:Range 全体を配列に読み込む
A2:C最終行を2次元配列に読み込みます。
Dim data As Variant
data = Range(Cells(2, 1), Cells(lastRow, 3)).Value
VB📌 data にはこんな配列が入る:
data(1,1) data(1,2) data(1,3)
data(2,1) data(2,2) data(2,3)
data(3,1) data(3,2) data(3,3)
...
ステップ3:配列の中で一気に処理(高速)
例えば「3列目が空白なら ‘NG’ を入れる」
Dim r As Long
For r = 1 To UBound(data, 1)
If data(r, 3) = "" Then
data(r, 3) = "NG"
End If
Next r
VB📌 ここが最大の高速化ポイント!
- 配列はメモリ上の操作
- Excel シートのような重い I/O が無い
- 数万行でも一瞬
ステップ4:配列を一気に書き戻す
Range(Cells(2, 1), Cells(lastRow, 3)).Value = data
VB📌 たった 1 回の書き戻しで完了!
→ これが何万行でも高速。
完成コード(初心者向け・そのまま動く)
Sub FastUpdate()
Dim lastRow As Long
Dim data As Variant
Dim r As Long
' --- 1. 最終行検出 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
' --- 2. データを配列に読み込み ---
data = Range(Cells(2, 1), Cells(lastRow, 3)).Value
' --- 3. 配列上で高速処理 ---
For r = 1 To UBound(data, 1)
If data(r, 3) = "" Then
data(r, 3) = "NG"
End If
Next r
' --- 4. 一括書き戻し ---
Range(Cells(2, 1), Cells(lastRow, 3)).Value = data
End Sub
VBなぜこんなに速いのか?(初心者向け説明)
❌ 遅いコード
Cells(i, 3).Value = ...
VB→ Excel に 1 回ずつ書き込む
→ 画面更新、内部処理、書式設定…毎回走る
→ 重くて遅い
✔ 高速コード
配列(r, c) = ...
VB- Excel に書き込まない
- 画面更新なし
- 書式処理なし
- メモリ操作は一瞬
そして最後に
Range(...).Value = 配列
VBの 1 回だけシートへ書く。
さらに実務寄り:列数も自動検出する
列の数も可変の場合:
Dim lastCol As Long
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
VB完全自動:
data = Range(Cells(2, 1), Cells(lastRow, lastCol)).Value
VB応用:各列ごとに別の計算をしたい
例:
- 1列目 → 数値を2倍
- 2列目 → 空白を「未入力」
- 3列目 → 「OK」/「NG」判定
For r = 1 To UBound(data, 1)
' 1列目:数値2倍
data(r, 1) = data(r, 1) * 2
' 2列目:空白なら補完
If data(r, 2) = "" Then data(r, 2) = "未入力"
' 3列目:チェック
If data(r, 3) >= 100 Then
data(r, 3) = "OK"
Else
data(r, 3) = "NG"
End If
Next r
VB仕上げ:Cells × 配列 × 自動範囲の最強テンプレ(完全版)
Sub FastProcessTemplate()
Dim lastRow As Long, lastCol As Long
Dim data As Variant
Dim r As Long, c As Long
' --- 自動で範囲検出 ---
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
' --- 配列に読み込み ---
data = Range(Cells(2, 1), Cells(lastRow, lastCol)).Value
' --- 配列処理(ここに好きな処理を書く) ---
For r = 1 To UBound(data, 1)
For c = 1 To UBound(data, 2)
If data(r, c) = "" Then
data(r, c) = "EMPTY"
End If
Next c
Next r
' --- 一括書き戻し ---
Range(Cells(2, 1), Cells(lastRow, lastCol)).Value = data
End Sub
VBまとめ(最重要ポイント)
| 技術 | 目的 |
|---|---|
| Cells | 行列を数値で扱い、自動範囲検出 |
| 配列 | 超高速でデータを処理 |
| Range(Cells, Cells) | 可変範囲を正しく表現 |
| 一括書き込み | Excel の遅さを回避 |
これで実務レベルの高速処理が書けるようになります。

