ExcelのVBAで高速化するなら配列!処理速度アップのテクニック
ExcelのVBAでもっと高速化させたいなと思ったことはありませんか?
「おまじない」で高速化できることはできますが、「まだ足りない」「もっと早くしたい」そんな思いもあって、探していたらやっぱりありました!
答えは「配列」を使うことです。
もしかしたら苦手な方もいるかもしれませんが、他の言語の配列とは少し違ったりするので、ぜひ使い方を学んで、いまより早くプログラムが実行できるようにしましょう。
それでは、VBAを高速化するための配列の使い方について解説してきます。
「おまじない」についてまだ見てないよーという方は、こちらからご覧ください。手っ取り早く高速化できます。
ExcelのVBAで高速化するための配列の使い方
ここでは、VBAで高速化するための配列の使い方を解説します。
VBAで高速化するためには、セルを配列の変数にいれる必要があります。
1Dim myArr As Variant
2
3myArr = .Range(.Cells(1, 1), .Cells(3, 1))
.Range(.Cells(,), .Cells(,))
上記のRangeでは、セルの範囲を指定します。
左側のセルが起点、右側のセルが終点。
このようにすることで、myArrにセルが1個ずつ入ります。
myArr(0)に起点セル
myArr(1)に起点セルの次のセル
配列にセルが入ったら、プログラムでやりたいことを実装していきいます。
このとき、Cells()は一切使いません。
配列はCellsと同じように使うことができます。
Cells(3, 1) = Cells(1, 1) + Cells(1, 2)
上記のことをしたい場合、次のようになります。
myArr(2) = myArr(0) + myArr(1)
上記の例でいえば、足し算の結果が3に入ります。
配列は0からはじまるので、結果がmyArr(2)に入ります。
そして、プログラムの最後に配列のセルを、元に戻してあげると終了です。
1.Range(.Cells(1, 1), .Cells(3, 1)) = myArr
このとき、myArrに入れたときと同じ範囲を指定します。
ExcelのVBAで高速化するためのテクニック
ここでは、VBAを高速化するためのテクニックを紹介します。
先ほど基本的な使い方を紹介しましたが、1次元配列であることに気づかれた方もいるかと思います。
1次元配列が使えるということは、「2次元配列も使える?」と思われたかもしれません。
もちろん、2次元配列も使えますよ。
2次元配列を使ってワークシート全体を配列にする
2次元配列としてワークシートを取り込めたら、VBA高速化の最終段階です。
1Dim myArr As Variant
2
3myArr = .Range(.Cells(1, 1), .Cells(3, 3))
このように、Rangeの範囲を広げることでセルが、2次元配列としてmyArrに入ります。
Cells(3, 3)までなので、行・列ともに3までの範囲となります。
ワークシート全体を配列にすることもできますが、`パソコンのメモリを多く使いますので、必要な分だけ配列に入れましょう。
必要なデータの加工、修正が終わったらこのようにセルに配列を返してあげましょう。
1.Range(.Cells(1, 1), .Cells(3, 3)) = myArr
VBAで配列を使うと高速化できる理由
ここでは、配列を使うと高速化できる理由を解説します。
メモリ上で処理することにより、処理スピードが上がる
セル上で計算していると、このような過程で処理されます。
- セル同士の計算
- 計算結果をセルへ書き出す
または
- セルから変数へ
- 変数からセルへ書き出す
これは1個の場合ですので、1000個データがあったら、1000回データを取得しています。
そして、1000回セルへデータを書き出しています。
これが1回でよくなったらどうでしょうか?
1000分の1の時間で済みますね。
また、単純にセル同士の計算より、メモリ上で計算するほうが早いです。
これはPCの仕様なので覚えていただくしかありません。
メモリ上にあるデータを加工するのか、Excelというアプリケーションの中にあるデータを加工するのか、どちらが早いのか?ということです。
セルに値を書き出すと遅くなる
上記で少し解説してしまいましたが、セルに値を書き出していると遅くなります。
アプリケーションを通しているからですね。
ですので、できるだけセルへ書き出す回数を少なくする必要があります。
今回解説した配列を使えば取得に1回、書き出し1回と極端に少なくできます。
また、ScreenUpdating=Falseを使うことで画面表示も消せるので、さらに早くなります。
ExcelのVBAで高速化するなら配列のまとめ
VBAで高速化をするなら、配列しかありません。
しかし、「大量のデータを扱わない」といった限定的な使い方になります。
いまのPCは高性能になってきましたので、遅いと感じていないのでしたら、高速化をする必要は無いです。
あくまで遅いと感じているときに、今回のような配列を使った処理をすればいいと私は考えています。
今回の記事でわかりにくいところがありましたら、相談窓口を設けていますのでよろしければご連絡ください。
Excel VBAを勉強するなら「できる大辞典」がおすすめです。
辞書なのでピンポイントで学ぶことができます。大学時代、2016年版を購入して勉強していましたが相当使いました。
ネットだけでも勉強はできますが、本を読みながらVBAを勉強したい方は購入してください。