VBAの初心者が書いたコードは、どうしても冗長になってしまう。
知識は無くてもなんとか目の前の業務を楽にしたいという思いで、ネットからコピーしたりマクロの記録コードをつかったりしながらやっとの思いで仕上げたマクロ。私もVBAを始めた当初は、いわゆるコピペプログラマーだったのでよくわかる。
プロシージャを分割したり、関数を作るという発想はなく、同じ処理が出てきたら同じコードをコピーして使いまわす。そうしているうちにコードはどんどん膨らみ、使われなくなった変数やコードの断片が放置され、インデントはバラバラ。冗長で汚い、一度メンテナンスをやめると書いた本人にすら手の付けられないマクロになってしまう。
そこで今回は、他人の書いたVBAのソースコードを読むとき、私がどのようにして作業を進めるかを紹介する。
もちろん、自分が過去に書いた謎のコードを解読するときにも役に立つテクニックである。
具体的な方法を以下に紹介する。
1) 変数宣言、変数の初期化、変数の利用場所を近づける。
変数名が適当に付けられている場合、まず変数が何を指すものなのかを突き止める必要がある。
宣言場所と使用場所が離れていると、それだけ意味が分かりにくくなるので、宣言文と初期化のコードは、その変数を使う直前に移動させると良い。
昔はコードの先頭ですべて宣言するのが普通だったらしいが、合理的ではないので最近そのやり方は流行っていない。
変数の使用場所があまりに散らばっている場合は、検索しながらブックマーク※をつけていく。
※編集ツールバーにある。
また、変数が最後に参照される箇所に「変数名:廃棄」などとコメントしておく変数のスコープがはっきりして読みやすくなる。
2) 変数の役割がはっきりしたら、変数名を自分にわかりやすいように変える。
英語が得意でなければ、一端日本語変数でも良い。
できれば、ひとつ変えるごとに、動作チェックをするのが望ましい。
3) 消せる変数は、消す。
たとえば次のような場合は、Cを消してFunc(A + B)にしてしまう。
C = A + B
Func(C)
こうした単純なケースで変数に代入されている場合があるが、コードを読みながら人の作った変数の役割を覚えておくのはしんどい。
上記の例でいうと、Cがコード中に何度も登場する場合は変数のままにしておくが、一度しか利用されないような変数であればどんどん消してしまう。
変数を作るとプロシージャ終了までトレースしないと、本当にその変数がそこで完結してるか分かりづらい。
変数を作らなければ、そのブロックなどの処理が後工程から参照されることは無いと保証できる。
4) 定数にできるものは定数に
リテラルが直接コード中に書かれている場合は意味のある名前がついた定数に置き換える。
また、変数として宣言されているにもかかわらず値が変わらないものも定数に置き換える。
定数は、すべて大文字にする。
5) セルの指定部分をわかりやすく変更する。
Range("F1")などと書かれていても、それが何のセルなのか毎回調べないと覚えられない。
私は以下記事で紹介した方法で、セルの指定をわかりやすいものに変更している。
thom.hateblo.jp
6) プロシージャを分割する。
分離できるコードを探してプロシージャを分離する。
1プロシージャあたり、だいたい画面に収まる分量が良い。
Functionプロシージャに置き換えできるとなお良い。
似たようなコードは差分だけ抽出して共通のプロシージャに置き換える。
私はウインドウ分割機能を使ってコードが同じことをしているかどうか確認している。
7) 何をしているコードかをコメントで補足する。
コードの役割が分かったら、その部分にコメントを書く。
以上の7ステップで、だいたい読めるようになるはず。
それでも分からない場合は、一度そのコードを丸ごと手入力で複写して見ると分かる場合がある。