配列(Array)を掌握せよ:VBA処理速度を100倍にする「メモリ操作」の極意
こんにちは。現場で「マクロが遅い」と嘆く声を聞くたび、私はこう伝えています。
「Excelのセルを直接いじるのは、泥沼に足を踏み入れるようなものですよ」と。
マクロの記録から一歩踏み出し、中級者への扉を開く鍵。それが「配列(Array)」です。今回は、あなたの書くVBAを劇的に高速化し、プロの領域へと引き上げる「メモリ操作」の極意を伝授します。
—
1. なぜ「セルへの直接アクセス」は遅いのか?
多くの人が最初に書くコードは、このようなものでしょう。
‘ 【アンチパターン】1万行のループでセルに直接書き込む
For i = 1 To 10000
Cells(i, 1).Value = i 2 ‘ ここで毎回Excelの再描画と計算が発生する
Next i
これの何が問題か。Excelはセルに値を書き込むたびに、「見た目の更新」「計算式の再計算」「条件付き書式」などを裏で一つずつ処理しています。 1万回繰り返せば、1万回その重い処理が走る。これが「遅い」の正体です。
—
2. 配列(Array)=「メモリ上の作業場」
配列とは、Excelのシートとは切り離された、PCのメモリ上にある広大な作業場のことです。
やり方は単純。
1. シートのデータをメモリ上の配列に一括コピーする。
2. その配列の中だけで高速計算する。
3. 最後に配列を一括でシートに書き戻す。
これだけで、Excelの重い処理は「最初の読み込み」と「最後の書き出し」の計2回だけで済みます。これが100倍速のカラクリです。
—
3. 実践:配列操作のテンプレートコード
まずは、この書き方をマスターしてください。これが現場で最も使われる「鉄板」のパターンです。
Sub ArrayOptimization()
Dim ws As Worksheet
Set ws = ThisWorkbook.Sheets(“Sheet1”)
Dim dataRange As Variant
Dim i As Long
‘ 1. セル範囲を配列に一括代入(これだけで爆速の準備完了)
‘ Variant型変数に代入することで、勝手に2次元配列になります
dataRange = ws.Range(“A1:A10000”).Value
‘ 2. メモリ上の配列をループ(セルを触らないので超高速)
For i = LBound(dataRange, 1) To UBound(dataRange, 1)
dataRange(i, 1) = dataRange(i, 1) 2
Next i
‘ 3. 配列を一気にシートへ書き戻す
ws.Range(“B1:B10000”).Value = dataRange
MsgBox “処理完了!驚くほど速かったでしょう?”
End Sub
ここがポイント!
- Variant型の変数を使う: 配列を受け取る際は、必ず `Variant` 型を使用してください。これにより、Excelが自動的にセルの範囲を「2次元配列」として格納してくれます。
- LBound / UBound: `LBound(配列名, 1)`(開始位置)から `UBound(配列名, 1)`(終了位置)までループすることで、配列のサイズが変わってもコードを書き直す必要がなくなります。
—
4. 初学者が陥りやすい「罠」
この「配列」の世界で、初心者が最初につまずくポイントがいくつかあります。
Q. 「配列の中身を直接書き換えられない!」
A. 上記のコードのように `dataRange(i, 1) = …` とすれば書き換え可能です。ただし、「配列の範囲を再定義(ReDim)」したり、「1次元配列と2次元配列を混同する」とエラーになります。
最初は「シートから受け取ったデータは必ず2次元配列(行, 列)」というルールだけ覚えておけば大丈夫です。
Q. 「なぜか値が書き戻されない!」
A. 書き戻す範囲(Range)のサイズと、配列のサイズが一致しているか確認してください。例えば、10行×1列のデータを書き出すなら、`Range(“A1:A10”)` と指定する必要があります。ここがズレていると、エラーになるか、すべて同じ値で埋まってしまいます。
—
最後に:エンジニアとしての心構え
配列を使いこなせるようになると、これまで数分かかっていたマクロが「一瞬」で終わるようになります。その時の快感こそ、VBAを操る醍醐味です。
「セルをいじらない」。
これが、あなたのVBAを「動くコード」から「信頼される資産」に変える最初の一歩です。
まずは手元のファイルで、ループ処理を一箇所だけこの配列方式に書き換えてみてください。その瞬間に、あなたの開発スタイルは「プロのそれ」に進化しますよ。
分からないことがあれば、いつでもまた聞きに来てくださいね。応援しています!
