2018年8月23日木曜日

EXCEL VBAよりrubyは早くて実にシンプルかつ高速

 仕事ではやむを得ず、EXCEL VBAを使うことが多い。EXCELシートにあるデータを簡単に使えるからだ。でも、とても遅い。そこで、rubyで書き換えてみた。
 その手法は、以下のとおり。
1)EXCELシートにあるデータは、Win32OLEのADOで、SELECTで1行ずつ、取ってくる。
2)VBAにはない、「ハッシュ」(連想配列)を、ユニークなキーごとの集計などに活用し、高速化する。
3)集計結果などはEXCELシートに書かず、CSVとして、出力する。これもまた、高速化のためである。
 今回、一番、手間がかかったのが、小数点第一位での四捨五入の書き方である。
 rubyは、型宣言をしないため、どのように記述すれば、実現できるのか、試行錯誤の連続だった。答えは、「割り算のメソッドとして、.divではなく.quoを使う」ということだ。divは結果が整数となる(つまり、例えば1.5が2にならず、1になってしまうのだ)が、quo は浮動小数になるのだ(だから、1.5はちゃんと2になるのだ)。わからにくいぜよ。
 ちなみに、くだんのEXCEL VBAのプログラムは40秒もかかっていたが、書き換えたrubyでは1秒もかからず、一瞬で終わる。1秒としても40倍の速さだ。凄いね。
 さて、皆さん、EXCEL、いやMS Officeは捨てて、rubyの街に出掛けよう。
 先日、星野 道夫さんの写真展を見た。アラスカの自然とそこで生きる人々。星野さんによれば、2つの自然があるという。身近のそれと遠く、訪れることないそれ。まったく、そのとおりだ。記念として、霜で白くフチどられたカラフルな葉っぱが並んだポストカードを購入。