
エクセルVBAプログラミングの個人レッスンを行いました。
今回の受講生はTさんという女性です。
Tさんは職場で、CSV形式のファイルに書かれたデータををエクセル表に取り込んで納品書などを出力するVBAの処理を使っています。これは昔いた社員が作ったものですが、その人は今はいません。そこで、その処理について教えてほしいという依頼でした。
簡単そうで難しい処理
その処理を行っているエクセルファイルを見せてもらいました。すると、短い処理ながらもかなりきちんと作られているこことが分かりました。
CSVからデータを取り込む、というとこんな処理を想像します(図のA)
- CSVファイルを開く
- 開いたファイルのデータを、1つづつ取り出して計算したり判定したりして、納品書のシートに書き込む
- 全部の列と行に対して2を繰り返す

ところが、見せてもらった処理は少し違いました(図のB)。
- CSVファイルを開く
- 開いたデータすべてと、表の形の変数にガバっと取り込む
- 表の形の変数から、1つのデータを取り出して判定して、納品書のシートに書き込む。
- 全部のデータに対して3を繰り返す
このBの処理は、ちゃんとプログラミングを勉強したプロが書いたプログラムのように思えます。
速く処理するためには

昔、私がプログラマーになったばかりのころ、VBAではありませんが似たようなことがありました。
私はC言語というプログラム言語でプログラムを作りました。図のAと同じように、データベースからデータを1件取ってきて処理する。というのをデータの数だけ繰り返します。ところがそこで扱うデータの量が大きかったため、プログラムの実行時間が5時間くらいかかってしまいました。
それは時間がかかりすぎてまずい。ということでベテランのNさんに修正してもらうことになりました。データベースから全部のデータを一度に取ってきてメモリー上に載せる。それを1件づつとって処理する。ちょうど図のBと同じイメージです。するとプログラムの実行時間は半分以下になりました。
Bのかたちで処理するほうが、早く終わるのです。
速いプログラムよりも見やすいプログラム

けれども、今回のVBAでは、Aの形でもおそらくはプログラムは1分もかからずに終わると思います。Bの形のほうが速いのですが、プログラムは一見難しそうに見えます。動作を確認するのも難しいです。
仕事で作ったプログラムはいつかは誰かに引き継がれます。エクセルの処理をVBAで作った場合、引き継がれた人がVBAに詳しいことのほうが稀です。それを考えると、処理速度を少しでも速くしようとするよりも、VBAにそれほど詳しくない人が見ても何をしているのかが分かるAの形で書いたほうがいいでしょう。私はそう考えます。
VBAでプログラムを作るときは、処理速度を速くするよりも、分かりやすいプログラムにするべきだと私は思います。それを引き継いだ人が理解しやすいように。
さて、Tさんには、職場で使っているそのBの形の処理について説明しました。TさんはVBAの初心者ですのでちょっと難しかったかもしれません。
私が主催するエクセルVBAプログラミングの個人レッスンでは、「職場で使っているこの処理について教えて欲しい」というかたが多くきます。そんなときには、今回のように説明しています。なるべくわかりやすいように。
コメント