Excel VBA | 「Cells を使った高速化(配列 × 自動範囲)」の入門版

VBA
スポンサーリンク

ここでは 「Cells を使った高速化(配列 × 自動範囲)」の入門版 を、初心者向けに “なぜ速いのか” までかみ砕いて解説します。
実務で 1,000 行 → 1 秒未満、10 万行でも一気に処理できる高速テクニックです。


結論:高速化のコアは「まとめて読み → まとめて書き戻す」

Excel は

  • シートへ 1 回書く
    だけでも、裏で“大量の処理”が走ります。

だから、

Cells(i, j).Value = ... を1万回
→ めちゃくちゃ遅い
(実務では 30 秒〜数分かかるケースも)


正しい高速化の考え方

  1. Range 全体を一気に配列に読み込む
  2. 配列の中で高速処理(超速い)
  3. Range に一気に書き戻す(1 回で OK)

これで 100〜1000 倍速くなります。


ステップ1:自動でデータ範囲を検出する

まずは Cells を使った“自動最終行検出” を行う。

Dim lastRow As Long
lastRow = Cells(Rows.Count, 1).End(xlUp).Row
VB

A列を基準に、値がある最後の行を取ります。


ステップ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 の遅さを回避

これで実務レベルの高速処理が書けるようになります。

VBA
スポンサーリンク
シェアする
@lifehackerをフォローする
スポンサーリンク
タイトルとURLをコピーしました