【入門編】配列(Array)を使いこなせ:セルへのアクセス回数を減らして処理時間を100倍速くする – Excel VBA解析バイブル

スポンサーリンク

配列(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を「動くコード」から「信頼される資産」に変える最初の一歩です。

まずは手元のファイルで、ループ処理を一箇所だけこの配列方式に書き換えてみてください。その瞬間に、あなたの開発スタイルは「プロのそれ」に進化しますよ。

分からないことがあれば、いつでもまた聞きに来てくださいね。応援しています!

タイトルとURLをコピーしました