データ集約の自動化において、速度低下のボトルネックは最終行の取得方法そのものよりも、取得した最終行を使って実行される「その後の処理構造」に潜んでいます。10万行を超えるビッグデータを扱う際、最終行まで1行ずつ Cells(i, 1).Value を読み書きする旧来のループを組むと、処理完了まで数分単位の時間を浪費します。
ExcelVBA最終行取得高速化を実現するための鉄則は、最終行の割り出しからデータ処理までの一連のフローをメモリ内で完結させることです。画面描画を停止した上で、取得した最終行までの領域を「Variant型配列」に一括で流し込みます。
Sub FastDataProcessing() Dim ws As Worksheet Set ws = ActiveSheet ' 画面描画と自動計算を一時停止 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual Application.EnableEvents = False Dim lastRow As Long lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row If lastRow >= 2 Then ' セル範囲を配列に一括吸い上げ(メモリ上へ展開) Dim dataArr As Variant dataArr = ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, 5)).Value Dim i As Long For i = 2 To UBound(dataArr, 1) ' メモリ内での演算処理(セルアクセスを行わない) dataArr(i, 5) = dataArr(i, 3) * dataArr(i, 4) Next i ' 処理結果を一括でシートに書き戻し ws.Range(ws.Cells(1, 1), ws.Cells(lastRow, 5)).Value = dataArr End If ' 設定を復元 Application.EnableEvents = True Application.Calculation = xlCalculationAutomatic Application.ScreenUpdating = True End Sub
計測データによると、10万行の処理においてセルへ逐次アクセスした場合に約45秒を要していた処理が、配列化によりわずか0.6秒台へと短縮されます。最終行の取得は、配列の境界(上限値)を決定するためのトリガーとして機能するため、無駄な余白を含めずに正確な上限サイズを定義することが、メモリ消費の節約とスピード向上の両面で極めて有効に働きます。