質問: 関数についてある程度マスターしたので、VBAとマクロについて勉強しようと思っています。 後者の方が出来ることは圧倒的に多そうなのですが、逆に関数にできてVBAとマクロではできない事というのはあるのでしょうか?
回答: VBAはプログラミング言語の一種です。VBAで書かれたSubやFunctionなどで始まる命令文の集まりをソースコードと呼び、ソースコードをコンパイルして実行するものを(狭義の)マクロと呼びます。質問サイトでよく見かける「VBAを作りたい」「VBAが動かない」「マクロ式」などという表現は言葉の誤用です。 ExcelVBAならプログラムの中でExcelの組み込み関数の全てを利用することができます。その意味では関数にできてマクロにできない事はありません。組み込み関数はとても便利で高速です。使い方をよく知っていれば、同じ処理をするコードを自分で1から書く必要はありません。 関数で間に合う場合はマクロではなく関数で済ませる、という議論もありますが、それもケースバイケースです。大抵の場合、複数の関数を組み合わせた数式は複雑で可読性が悪く、どのセルにどんな数式が入っていて相互にどう影響するかは直感的に理解できるようにはできていません。マクロはソースコードにコメントが残せるし、変数を使ったり、処理を複数のプロシージャーに分けたりできるので、保守性の点ではまだましです。 ドキュメント(説明書き)を残せという議論もありますが、それで万全というわけでもありません。作った本人以外には分からないものがどうしても含まれます。実務で数式満載のブックや複雑なマクロを引き継ぐのは相当難しいことだと覚悟しないといけません。 ちなみにExcelに自信がある人は「関数を組み合わせて複雑な数式を書ける」ことを美徳としている人が多く、ExcelVBAに移っても、変数を使わなかったり、処理を入れ子にして少ない行に収めようとする傾向があります。そういう書き方だと後で保守するのが大変だし、エラーが起きたとき原因を特定しにくくなります。VBAでは、きちんと意味が分かるよう命名された変数に値を入れる(aとかnとかmyDataとかmySheetとか意味が漠然としていて書いた本人ですら理解できない命名が多い)、処理は入れ子にせず段階的に分けて書く(関数A(関数B(関数C))みたいなのはあまり良くない)、異なる処理は複数のプロシージャーに分けて書く、一つのプロシージャーは行数を少なく簡潔にする、ということが重要です。面倒くさがってこういう鉄則をおざなりにすると後で痛い目にあうんです。