Excelマクロ VBAの高速化は?
今回はVBAの高速化について、書きたいと思います。
初心者さん向けのExcelVBAの記事を書いてます。
興味のある方は是非ご覧ください。
1.高速化の方法
よくネットで調べると、以下の様な方法が多く見受けられます。
・Excelの出力時に「Application.ScreenUpdating = False」で描画をとめる。
・再計算を適宜とめる「Application.Calculation = xlCalculationManua」
・セル、シート、ブックなどのSelectや、Selectionを極力やめる。
・配列に入れて処理する。
・セルへのインプット、アウトプットの回数を減らす
・ロジックや設計で高速化
上から順番に、難易度が少しずつ上がるのかな?と思う順に書いてみました。
配列とIOの順番は、一見IOの方が簡単そうに見えましたが、そもそも配列を使う前提のケースが多いかな?と思い、この順番です。
2.配列に対する期待と裏切り
自分もそうでしたが、徐々にVBAを覚えてきて、処理速度を追い求めた結果、配列で処理することにたどり着くと思います。
配列は初心者にはかなりハードルが高く、突然セルで可視化されていたデータが配列という見えない空間に追いやられ、さらには最終次元しか拡張出来なかったり。
今、この配列にはこのデータがあって、あの配列のあのデータを参照して・・・(パニック)
などなど
セルの見えるデータに慣れているところから、飛び込むと自由に配列をイメージ通りに操作出来るようになるまで時間がかかります。
その分セルを直接操作していた頃と比較して、高速の世界が待っていると大きな期待を胸に、
取得してみた結果・・・。
確かに早くなったかもしれないけど・・・。
と満足のいく結果を得られなかったり。
理由は最後に書いたIOの回数を改善してないからですね。
VBAがというか、Excelのセルへの入出力ってめっちゃ遅いんですよ。
3.配列とIOは合わせて高速
配列に慣れてきたら、徐々にコードのチューニングや初期の設計自体をIOの回数を減らすことが意識出来るようになります。
早い話が、前処理後に配列に入れたら、あとは結果まで処理して、最後の一回だけ出力すれば良いのです。
4.ロジックを考える
ここまで来ると、あとはロジックを考えるところに行き着くのかなと思います。
前項で太字にした前処理がめっちゃ大事だったりします。
前処理は言い出したら1記事では終わらないので、ここでは割愛しますが、ループ回数を極力減らせる方法を考えたり、不要なデータを事前に削除しといたり。
意外とこんな作業の一つ一つが大きな結果に繋がります。
5.僕の中の最速の方法
それはdictionary(連想配列)です。
dictionaryの使い方は、「VBA dictionary」と調べるとわかりやすいサイトがいっぱいありますので、そちらをご覧下さい。
なぜ最速なのか、というと格納したKeyをもとに、格納したItemを取得出来るからです。
簡単なコードで説明したいと思います。
6.配列とdictionaryの処理速度
計測したサイトも多々ありますので、ざっくりとした計測です。
以下、1万行あるA列データを検索値として、D列を参照値から一致するE列のデータを取得してみます。
7.まとめ
少しずつコードを覚え、配列で自由に処理できるようになったら、配列の代わりにdictionaryに置き換えてみると色んなことがより早く処理出来るかもしれません。
具体的な応用したロジックは近々、別の記事で書きたいと思います。
最後まで読んでいただきありがとうございます。
この記事が気に入ったらサポートをしてみませんか?