エクセルで大容量データなんか取り扱えっかよ!という話がちらほら聞けて、まあ実際データベースでやりとりした方がいいに決まってはいるが、100万件くらいならエクセルでもそこそこ高速に処理できる。

 

で、今いる課でエクセルじゃ無理ですってドキュメントと一緒に梱包されたアクセスDBと連携したマクロがあったが、これがまた1分以上かかるのだ。

仕様見てアクセス抜きで作り直して3秒で動くようにしてやったが、実際やり方さえ分かってればそんなに重くならない。

 

早くする方法だけど、いうまでもないといえばそれまでだけど。

 

VBAだけに限った話ではないが、まずセルに変数代わりに書き込むのをやめろ。

メモリで処理したデータ後で一気に打ち込め。

なんでもできて便利だなって思う初心者の鉄板の動的配列とかもやめろ。

データ100万件計測するのに100万回、100万のデータを他データと比較するのに1億回参照するんだぞ。止まるに決まってるだろ。比較とかはブーリアンとかなら処理はめちゃめちゃ早いので、連想配列などで文字列を予約させる。

 

という感じ。

特にオブジェクトっていう便利なものがあるので、インスタンスすれば個別にレコードを参照しなくても仮想テーブルに突っ込める。

for i = 1 to 1000000

  cells(i,1).value = funifuni(i)

next

とか愚の極みでしかない。

 

set rng = range("A1:A1000000")

rng = funifuni(一次元配列だと縦横逆にしないとダメかも)

とかやれば一瞬で終わる

 

と、まあそう言う簡単な事守ってれば結構やってくれるよ奴は。

 

それでも足りないのならプロシージャ終了→自動実行で分割させて無理やりメモリ解放させたり(ガベージコレクションとかそう言うのがない。よく記事で得意げにset punyupunyu= nothingをご教示してるが、実際の仕様として参照は抜けないので限りなく意味ない)、いっそテキストファイル作ってそっちで処理させたりすることになる。

何れにせよ別にDB連携とかする必要は基本的にないから、エクセルのせいにしないで頑張って工夫してくれ。