バグに強いVBAを書く方法


エクセルでの分析が少し複雑になってくると、どうしてもマクロ、VBAを書くことが必要になってきます。そうすると、バグに悩まされてしまい、もういやだ。。。ということになってしまうこともしばしばあるかと思います。

そこで、今回は、バグが起こりにくい、そして起こった際にもスピーディーに解決出来るVBAを書くためのコツを、お伝えします。中には一般的にプログラミングする上で重要な考え方もありますが、データ分析をより効率的に出来るように、是非実践してみて下さいね。

 

大まかな処理ごとに、入力, 出力,実行ボタンをワークシートに配置する


まず避けたいのは、ボタンを押すと全て処理をしてくれるようなVBAを作ってしまうことです。VBAは、良い意味で、他の言語とは違い、ワークシートというものがついています。ですので、ボタン一発で全てやってくれるようなものを作るのではなく、複数の処理を個別にワークシートから呼び出せるように作るのです。そうすることにより、一個一個の処理の結果を視覚的に見ることが出来ます。

そして、それぞれの処理が出来たら、最後に、ボタンを作成し、VBAの方では、各ボタンに関連付けられたSubを呼び出すようにするのです。そうすれば、普段はそのボタンのみで終了させることが出来ますし、なにか問題があれば、個別処理のボタンを一個一個押してみて、結果を確認することで、どこでエラーが起こったのかがすぐに把握出来るようになります。バグは起きないように作るのが大前提ですが、それでも出てしまうものです。であるならば、起こった時に原因がすぐ突き止められるように作っておけば、問題解決もスピーディーに図ることが出来るでしょう。

 

なるべくコードは書かず、可能な限りワークシートで対応する


上にも書いた通り、エクセルにはワークシートというものがありますので、積極的に活用すべきです。つまり、ワークシート上の関数で対応できるものは、可能な限りVBAを書かずに、ワークシートの方で対応してしまうのです。そうすることにより、処理の内容を可視化することが出来、バグにも気がつきやすくなります。

 

関数は可能な限り分割する。1つの関数で1つだけの処理を。


関数を作る時の原則は、1つの関数で行う処理は1つにしておくべき、ということです。あれもこれも処理する関数というのは、再利用性バグを防ぐ観点から、避けたほうが望ましいです。1つだけの処理にしておくことで、他の箇所でも呼び出すことが可能になります。ところが1つの関数内でいろいろな処理をしてしまうと、他の箇所で使えなくなってしまいます。

また、1つの関数で1つだけの処理を、ということはつまり、if文の記述が減る、ということです。if文はバグの温床になりやすいので、可能な限り書かないほうが良いでしょう。とは言ってもどうしても場合分けが必要となることもあるでしょう。それが次のトピックです。

 

if文は可能な限り浅い階層で使用しましょう。


上でも書いた通り、完全にif文を書かない、というのは難しいでしょう。但し、

  • 1つの関数では1つの処理のみ行う
  • 呼び出し側、つまり制御側で、if文を書き、上の(if文を可能なかぎり持たない)関数を呼び出す

という方法を使うのです。そうすることで、もしエラーが起こったとしても、深い階層までデバッグを行わずに、原因が特定出来ることが多くなるのです。

 

適切にエラー処理を行いましょう。


VBAでは残念ながら、try, catch構文が存在しません。なので、errorをthrowすることも出来ません。ではどうすればよいか?これまでの経験では、以下の様な進め方が最も安定的に進められていたように思います。

  1. エラーをthrowする代わりに、特定のセルにStatusを出力する。なお、その際にはERRORなど、特定の文字列を含むようにする。関数を作っても良い。
  2. ワークシートにあるStatusをチェックし、errorであれば、true, 正常であればfalseを返す関数を作る
  3. 各関数の開始時に、2の関数がtrueであれば、exitするように記述する

まず1の「エラーをthrowする代わりに、特定のセルにStatusを出力する」ですが、

worksheet.range(“A1”) = “ERROR::” + “<関数名>::” + “<メッセージ>”

のようにstatusを出力するようにします。

次に2の関数ですが、

のようなものを作成します。

そして、各関数の開始時に

if is_error  then exit function

と記述します。

これにより、エラー処理が可能になり、突発的なバグは起こりにくくなます。

 

いかがでしたでしょうか?分析作業は大変な労力が伴うものです。可能な限りバグが起こらない、また起こった際にすぐに解決できるような環境を整えておいて、分析作業により多くの時間をかけられるようにしましょう!


COMMENTS