はじめに
本記事では、1年目のエンジニアが初めてVBAで集計ツールを作成したときにとても勉強になったことを備忘録として書きます。
一概にこうするべきだというわけではないですが、「こういう視点でツール作るといい感じに仕上がるかもな」とほんの少し参考になりそうなことをまとめました。
実装でのコツ
初心者の私が適当に書き始めると分かりにくくて非常に解読しづらいコードになってしまうんですよね。修正もしづらかったり。
作ってる最中は良くても、運用し始めた時に何が何だかわからないマクロを作ってしまうと後々困ります。
また気付かぬうちにナンセンスなツールを作成してしまっていたりもするのです。
これをマシにするために以下のようなことに気をつけました。
① 固定の数値は定数として定義する
定数化しておくと楽だし、分かりやすいです。手間がかかりそうに感じるけど名前つけちゃった方が便利な時もあります。
とても簡単に例を出すと以下のような感じです。1個列増えたからA列からB列にしたい…的な状況です。
' A列にデータいれる
Cells(1,1).Value = "A列1行目"
Cells(2,1).Value = "A列2行目"
...
'後からこれ全部をB列に変更するのは面倒
' セル番地
Public Const ADR_COLUMN = 1
' A列にデータいれる
Cells(1,ADR_CLOUMN).Value = "A列1行目"
Cells(2,ADR_CLOUMN).Value = "A列2行目"
...
'これなら定義部分(ADR_COLUMN)だけで列変更ができる
他にも定数化はメッセージボックスの特定文言や、固定フォーマットなどにも使えると思います。
② モジュールを分ける
vbaは標準モジュールを一つ追加してそこにコードを書けばいいんだよね?と思っていましたが現場の人の作成したマクロを見てみるとモジュールの名前も変更していい感じに使い分けていたんです。
かっこよかったのでとりあえず真似しましたが、実装したいことが増えていくにつれよさに気づきました。
使い分けは以下のような感じです。
md_00_const ⇒ 定数の定義
md_01_main ⇒ メインの実行するマクロ
md_99_util ⇒ 汎用性のあるfunctionなど
もちろん定数なんかはモジュールの一番上にまとめて書いておくでも事足りるとは思うのですが、これはこれで分かりやすいし良いなと思いました。
③ 定数や関数の名前のセンス
これは大変難しい問題です。私はまだ初心者枠なので名づけ下手です。
現場の人の名づけ方で学んだのは、定数なら接頭語をつける、関数なら何する何をの順で書く!ということです。
セル番地 ⇒ ADR_○○
ワークシート ⇒ WSNAME_○○
フォーマット ⇒ FORMAT_○○
住所なのかシート名なのか等々一気にわかりやすくなります。
何かの値を取ってくる ⇒ get○○()
表作成のファンクション ⇒ createTable()
VBAとかだとついつい日本語でプロシージャ名つけたくなるのですが「素人っぽい」と思われないためにも頑張ってこのようn命名してみました。
④ チェック処理をいれる
ファイルを読み込む前にそのファイルが存在してるか、入力された値の型が想定と合っているか、とかです。
作ってる側なので無意識のうちに「存在しないファイル名なんて入れないだろう」とか「日付入力欄なんだから整数でいれてくれるだろう」と思い込んで作成してしまってました。
しかしツール作成の中で、使う人は分からないかもしれないとか、間違えて入力しちゃうこともあるかもとか、色んな可能性を考えて処理落ちしないようにするのも作成者のやるべきことだと学びました。
優しさはなんぼ持ってたっていいですからね。チェックしてあげる優しさを持とうと思いました。
まとめ
以上、ExcelVBAでツールを作成した時に気を付けたことでした。
こういうのはどうしたって他の人の成果物から学ばないと気づけないなと思ったので今回記事にしてみました。
自分では最善だと思っていた方法よりも良い方法に出会たりするといういい気付きを得られました。
今後も現場の成果物からいいところ見つけて自分も使いこなせるようになりたいと思います。