久々にExcelVBAを組んだ
昨日は仕事で久しぶりにExcelVBAを組んだ。マクロ構築作業って、なんだか日常とは頭の使いどころが違うので、疲れたが心地いい。イヤな仕事をしているときの頭痛や発熱のような症状が一切無い(笑)。そんな頭痛仕事が多くなってる昨今、やはり自発的なアイデアを形にするのがもっともオレに向いているようだ。
とはいえ昨日の場合、クオリティよりも短時間で組み上げて検証し動かせるというのが大前提だった。小規模なデータマイニング作業とでもいうのだろうか。
●VBAでのデータマイニング処理は引越し屋さんだ
そういうときは「必要なn種類の要素を必要なn次元配列にぶち込んで必要な再計算・並べ替えをして吐き出しやすい形に整えたシート範囲に吐き出す」というカタを持ってると早い。例えるなら元データは旧社屋ビル(複数の階がある)、配列変数は引越し屋さん、吐き出し先のシート範囲は新社屋(こちらも複数の階あり)というイメージで、オレはさしずめ仕事が早いと評判()の引越し屋のオヤジだ
。
記録マクロはあまり使わない。カタが決まっているので変数定義と要素とのマッチングを最初にやる。要素が全部入る箱を最初に作るのだ。引越し屋さんが全部入る箱の大きさや数を決めてとにかく全部入れるってこと。
次にループ範囲を決める。ループとは処理の繰り返し。何回荷物を運ぶのかだ。そのなかで配列変数に代入される値(要素)が一回ごとに変わるわけだ。同じタンスは二回運ばないだろ。毎回違う荷物を運び出すのだ。
通常は動的にループ回数が変わるので、まずそれを見つけてからループ回数を再定義してループさせるのだが、昨日はめっちゃ急ぎだったのでそのループ範囲もワークシートにループに必要なFromToのセルを作って回数を入れといて、ぜんぶそこを見てループをさせた。こういう部分を手抜きするのは手っ取り早いし害がない。
最後にループ処理で配列変数に収まった値を、場合分けしながら計算して、セル範囲に規則的に振り分けて吐き出していく。引越し屋さんが新居に家具をレイアウトしていくわけだ。
これで引越し完了。あとは思ったとおりにデータが配置されたかどうか再点検するわけだ。これはちょっとしたコツがいる。場合分けしながら計算するときにエラー処理を丁寧にかましておく。どの場合にも当てはまらないデータが出たときにどんなメッセージを出すかがキモだ。
●経験が必要なのはプログラミングよりエラー処理
プログラミングにおける間違い探しはとにかく時間がかかる。いかに間違いの箇所を素早く発見するかが開発効率を左右する。ここがもっとも経験の必要な部分で、それ以外は正直誰でも出来る。引越し屋さんで言えば、ミスのないように手順を決め、その手順どおりできてなければどんな間違いがどこにあるかを発見できるオヤジだ。運ぶのはバイトでも出来るのだ。
あと「合計値が合わない」というのが困る。昨日もあった(元シートが規格外に作られていた)。これを見つけるのも大変...。昨日はシート別の合計を出せるような条件をかましつつ、1シートごとに検証していった。一番時間がかかった。そのかわり、データマイニング範囲をユーザーが(ってオレのことだが)細かく選べる仕様になって不幸中の幸い。毎回全部を計算しなくていいときには時短にもなる。
というわけで、ここまで設計とVBAの記述に合計4時間、その後の検証に4時間半で完成した。規格外の元シートがなければ検証3時間は短縮できたはず。元データを作る人々のスキルは様々だから仕方ないけど、こういうときにエンドユーザーコンピューティング(EUC)の水準が組織力の差となって現れるんだろうな。
また、本来なら作業ごとにサブルーチン化するとか、動的配列をもっと柔軟にするとか、ループ回数も動的に変化させるとか、エラー処理をもっと丁寧にやるとか、質的にはいろいろあるが、とにかく1日で完成させなければならない状況だったので、満足満足!
あと、実行速度の面で忘れちゃならないプロパティが1つある。ScreenUpdatingプロパティだ。これを入れると入れないとではかなり違う。VBA初心者のうちから使うべきだ。ただし検証前に入れるとどこでエラーになったか見えなくなる場合もあるから、作りながら画面更新しない範囲を広げてゆき、最後に全体に適用するといった工夫が必要かも。ひとくちメモでしたー。
| 固定リンク | 0
コメント