Excelの使い方とプログラム

Excelに数値を入力しておいて、その数値を電卓で計算して合計を出していたのを見た、という記事があって。

それが本当の話かは措いておいて。この話は、せっかくの表計算ソフトなのに機能を全く使えていない、そういう関数が存在する事自体発想もしない、というような話ですが、それとは違う方向で上手く使えていない場合もあるよなあ、という所も考えました。

これは私が実際に見た事例なのですが。
数十万件のレコードがシートに入力されていて、そこから目当てのものを検索する、というのが業務上必要な事があって。

これは、DBからADO使ってSQLで採ってくる、というのでは無く、ワークシート上のデータ集合から抽出したり並べ替えたりする、という要件だった訳ですね。で、ある程度プログラムを書ける人が、VBAで、何やらごちゃごちゃしたものを作っていたのですが、それが実に遅い。コード見ると、ソートやら抽出を、全部VBAの関数を使って書いていたのですね。そういうやり方だと、下手に書くと、ものすごく遅くなって、実務上、だいぶ不便になったりしますよね。

で、実際には、そういう風に、全部VBAで書くより、Excelに搭載されているオートフィルタやワークシート関数などを使った方が、遥かに速くなる場合があるのですよね。Excelのフィルタやワークシート関数はとても強力なので、VBAで AutoFilter メソッドなどを使って作った方が、圧倒的に速く、コードも簡潔になったりする。

実際そのようにして私が作った所、コードは数十分の一くらいの量になって、検索速さもずっと上がりました(一件あたりの検索速さが数十倍)。

それで、ここが重要なのですが、私はその時、その辺りの仕組みを意識しておこなった、のでは無く、VBAの知識に乏しかったからそうするしか無かったのですね。VB系の関数はあまり知らず、そもそもそれを使って一から作る事自体が出来なかったので、オートフィルタやワークシート関数などをVBAから操作して簡潔に作る、しか無かったのです。それで調べていく過程で、どうやら、なまじな知識のままに全体を自作するよりも、元々表計算ソフトに搭載されている機能を使ってやった方が効率的な場合がある、というのを知ったのでした。

ある意味で、プログラムの知識などが邪魔をしなかったために、ソフトの持つ機能を使ってあげられた、という事だったのだと思います。中途半端にVBAを知っていたら、そのままフィルタなどを試す事無く、効率の悪いコードをごちゃごちゃ書いて、遅いプログラムを完成させて使っていた、のかも知れません。

念のため。
この記事では、VBA と、オートフィルタやワークシート関数、とを対比させていますが、もちろん、フィルタやワークシート関数をプログラムで用いるのもVBAの内だろう、と言う事も出来ます。けれど、ここでは、敢えて区別して語っています。