マクロ(VBA)
 PR

ExcelのVBAで高速化するなら配列!処理速度アップのテクニック

ねこる
記事内に商品プロモーションを含む場合があります

ExcelのVBAでもっと高速化させたいなと思ったことはありませんか?

「おまじない」で高速化できることはできますが、「まだ足りない」「もっと早くしたい」そんな思いもあって、探していたらやっぱりありました!

答えは「配列」を使うことです。

もしかしたら苦手な方もいるかもしれませんが、他の言語の配列とは少し違ったりするので、ぜひ使い方を学んで、いまより早くプログラムが実行できるようにしましょう。

それでは、VBAを高速化するための配列の使い方について解説してきます。

「おまじない」についてまだ見てないよーという方は、こちらからご覧ください。手っ取り早く高速化できます。

あわせて読みたい
ExcelのVBAを高速化する際のおまじないを詳しく解説
Excelの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)に起点セルの次のセル

Rangeの説明

配列にセルが入ったら、プログラムでやりたいことを実装していきいます。

このとき、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に入れたときと同じ範囲を指定します。

4個のセルで説明しましたが、この程度のセルを配列にしてプログラムを動かしたとしても数が少なすぎるので高速化の効果は感じられません。

1000個ぐらいあると「早くなったな」と感じられます。

この方法で一番高速化できるのは、セルの値を加工したり、修正したり、他のファイルからデータを取得することです。

使う場面は限定的ですので、大量のデータを扱わない場合は使わないことをおすすめします。

ExcelのVBAで高速化するためのテクニック

ここでは、VBAを高速化するためのテクニックを紹介します。

先ほど基本的な使い方を紹介しましたが、1次元配列であることに気づかれた方もいるかと思います。

1次元配列が使えるということは、「2次元配列も使える?」と思われたかもしれません。

もちろん、2次元配列も使えますよ。

2次元配列

2次元配列は、100マスx100マスのように縦と横に広がっている配列のことです。

Excelのワークシートを配列の変数に入れたと思っていただけたら想像しやすいかもしれません。

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で配列を使うと高速化できる理由

ここでは、配列を使うと高速化できる理由を解説します。

VBAで配列を使うと高速化できる理由
  • メモリ上で処理することになり、処理スピードが上がる
  • セルに値を書き出す部分が遅いので、配列を使うと極端に少なくできる
VBAで処理が遅くなる理由
  • セル上で計算している
  • セルに値を書き出している
  • ウィンドウを開いたり、閉じたり、画面表示の切り替えをしている

メモリ上で処理することにより、処理スピードが上がる

セル上で計算していると、このような過程で処理されます。

  • セル同士の計算
  • 計算結果をセルへ書き出す

または

  • セルから変数へ
  • 変数からセルへ書き出す

これは1個の場合ですので、1000個データがあったら、1000回データを取得しています。

そして、1000回セルへデータを書き出しています。

これが1回でよくなったらどうでしょうか?

1000分の1の時間で済みますね。

また、単純にセル同士の計算より、メモリ上で計算するほうが早いです。

これはPCの仕様なので覚えていただくしかありません。

メモリ上にあるデータを加工するのか、Excelというアプリケーションの中にあるデータを加工するのか、どちらが早いのか?ということです。

セルに値を書き出すと遅くなる

上記で少し解説してしまいましたが、セルに値を書き出していると遅くなります。

アプリケーションを通しているからですね。

ですので、できるだけセルへ書き出す回数を少なくする必要があります。

今回解説した配列を使えば取得に1回、書き出し1回と極端に少なくできます。

また、ScreenUpdating=Falseを使うことで画面表示も消せるので、さらに早くなります。

あわせて読みたい
ExcelのVBAを高速化する際のおまじないを詳しく解説
ExcelのVBAを高速化する際のおまじないを詳しく解説

ExcelのVBAで高速化するなら配列のまとめ

VBAで高速化をするなら、配列しかありません。

しかし、「大量のデータを扱わない」といった限定的な使い方になります。

いまのPCは高性能になってきましたので、遅いと感じていないのでしたら、高速化をする必要は無いです。

あくまで遅いと感じているときに、今回のような配列を使った処理をすればいいと私は考えています。

今回の記事でわかりにくいところがありましたら、相談窓口を設けていますのでよろしければご連絡ください。

Sponsor link

Excel VBAを勉強するなら「できる大辞典」がおすすめです。

辞書なのでピンポイントで学ぶことができます。

大学時代、2016年版を購入して勉強していましたが相当使いました。

ネットだけでも勉強はできますが、本を読みながらVBAを勉強したい方は購入してください。

amazonで見てみる

ABOUT ME
ねこる
ねこる
管理者
Mac / プログラミング / Excel / マクロ(VBA) / カメラ

調べたり、効率的なことが好きです。

記事URLをコピーしました