仕事にようやくひとくぎりがついて、「目の前のこと」ではなく「将来のこと」にかける時間をそれなりに取れるようになってきた。
スティーブン・コヴィーが「7つの習慣」言うところの「第2領域」というヤツである。
で、今日、数時間かけて取り組んでいたのが、スケジューラのメンテナンスとバージョンアップ。
塾長は、マクロで動くスケジューラを使ってスケジュール管理をしているのだが、行き当たりばったりで作ったままになっていて、じっくり中身をメンテナンスする余裕がなかったものだ。
スケジューラに望むことがかなり増えてきて、このところ、機能的に限界を感じるようになっていた。
スケジューラのような大がかりな表をメンテナンスするときには、ひとつの列にあったデータを分割して複数の列に置くようにしたり、F列にあったデータをB列に移動してみたり、新しくG列のあと3列に別のデータを挿入したり、と、かなり大がかりな作業になるものだ。
実際、今回塾長がした作業も、表の途中に1列、後ろに3列を追加するなど、なかなか面倒な作業だった。
とはいえ、列名の指定などは普段から定数を使うように心がけているので、それほどヘビーな作業にはならなかった。
Excel VBAでコーディングする際には、普段から、モジュールレベルで定数を宣言しておいて、それを扱うように習慣づけておくと良い。
以下の画像の要領である。
そうすると、あとから列を追加しても、その列用の定数を新たに作り、それ以後の列を指定する値をひとつずつずらしていくだけでよいので、メンテナンス性が高くなる。
このときには、定数名を、「何のデータを格納している列なのか分かるような」名前にするのがコツである。
例えば、
Public Const I_COL_PROJECT As Integer = 7
Public Const I_COL_APPOINT As Integer = 8
Public Const I_COL_TASK As Integer = 9
Public Const I_COL_ESTIMATE As Integer = 10
上記のものは、それぞれ、以下の情報を格納した列だ。
●プロジェクト
●アポイント
●タスク
●見積もり
それから、並べ替えや色つけの範囲を決定するときのために、表のいちばん最後の列は、重複しても、
Public Const I_COL_RNEXT As Integer = 16
Public Const I_COL_END As Integer = 16
のように、2つの定数で指定するようにしておく。
そうすると、あとで I_COL_RNEXT で指定していた列より後ろに列が追加されるようなことがあっても、修正箇所は少なくて済む。
達人養成塾のマクロ初中級コースでは、資格試験対策のような内容は一切やらないが、実は、こういった、「どうすればメンテナンスが楽なマクロを書けるようになるか」といった、「実践的に役立つ知識」については、かなりの時間を割いて説明するようにしている。
実際、受講生の感想では、「『実務ではこう使えます』といった説明が多いのがよかった」といった感想を多くいただいている。塾長がうれしいのは、まさに、そういう感想をもらうときである。
http://www.exvba.com/kanso.php
サブプロシージャ中のセル範囲に「 Range("F" & c).Value = … 」みたいな記述が多ければ多いほど、メンテナンス性は低くなると思って間違いない。
定数を利用して可読性を高める工夫をこれまであまりしてこなかったという方は、ぜひ参考にして欲しい。