ExcelVBAはExcelの関数とは別物
ITサポーターTsuchidaの土田です。
Excelを得意とする人はExcelの関数を使いたがります。人によって関数を極めようとして、IF関数と他の関数をネストしたりして数式バーで2行になるような、この数式は何をやっているのだろうと理解するのに時間がかかることもあります。関数を使ってできるだけ自動化するための、涙ぐましい努力なのかもしれません。
私がExcelを使いだして30年近く経ちますが、ExcelのVBAと関数って全く別物だと思っています。
ExcelのVBA→自動化するプログラム
Excelの関数→高度の計算をする電卓
関数は計算式をセットしておくことで、参照先のセルの値によって計算してくれる便利な電卓のような機能です。電卓は手作業の時はものすごく役立つ計算機でした。Excelでも手入力との組み合わせで使うと非常に便利な機能です。
関数が便利なのは入力作業の補助としての場合で、毎回同じフォーマットのデータが届いて、同じアウトプットのデータを作成する場合には、自動化したいと思ったときに関数では限界があります。よくあるのが、データが届くたびに、あらかじめ関数がセットされているブックに元データを値貼り付けをして、貼り付け後に関数で計算や文字列変換した結果をコピーして、専用のアウトプットに値貼り付けします。関数は計算や文字列変換はしてくれるのですが、新しいデータを読み込むことができないので、ファイルを開く、データをコピーして値貼り付けをするという手作業はなくなりません。この手作業をなくそうと思うと、関数ではなくVBAでプログラミングをして自動化するしかありません。
関数に限界を感じてVBAを学ぼうとするときに、いくつかのハードルがあります。変数の使い方、IfステートメントやFor Nextステートメントなどのプログラミング独特の考え方の他に、関数を使いすぎてなんでも関数を使おうとすることです。
例えば関数に慣れていると、合計はSUM関数で、件数を数えるのはCOUNTA関数、数値の件数はCOUNT関数で、平均はAVERAGE関数と条件反射で出てきます。もちろんVBAの中でも、WorksheetFunctionを使えばExcelの関数の機能を使うことはできます。合計や件数や平均を計算するために、わざわざExcelの関数を使うと引数をセットすることが面倒なのです。
SUM関数って合計なので、連続するセルの値を変数に合計して、合計した変数を合計セルに代入すればいいのです。COUNTA関数は変数に値の入っているセルを数え、COUNT関数は変数に数値の入っているセルを数え、AVERAGE関数は合計した変数を数値のセルを数えた変数で割れば求めることができます。
VBAの中でどうやってExcelの関数を使うかを考えるのではなく、Excelの関数はVBAでプログラミングするとどうやれば作れるのかを考えられるようになると、VBAの上達の一歩になると思うのです。
VBAと関数を両方使っている人間からすると、何でもVBAを使えばいいかというとそういうわけではありません。VBAでできないとして、新規データ入力と元に戻すという操作ができません。そのため入力操作の補助に関してはVBAではなく関数を使うべきです。
関数に向く業務:入力作業を伴う定型業務、非定型業務
VBAに向く業務:入力作業を伴わない定型業務
関数の延長としてVBAをとらえるのではなく、VBAは関数と違う役割として使うものと考えるべきです。私が業務を見ている限り、関数はそれなりに使われているのですが、VBAはほとんど使われていません。
入力作業の伴わない定型業務には、業務システムやクラウドからダウンロードしたデータの加工や他社とのデータのやり取りがあります。この作業を自動化できればかなり事務作業の効率が上がります。数年前に東京で受けた講習の中で、クラウドを使っているとcsvファイルをダウンロードすることが増えて、ExcelのVBAを使う機会が増えたという話を聞きました。csvファイルから手作業で毎回同じアウトプットを作るのは効率が悪い作業です。この作業はExcelのVBAに最も向いています。
ExcelVBAの掲示板を作りましたので、質問があれば掲示板にコメントしてください。
https://note.com/it_supo_tsuchi/circle/boards/7fcf9b7cba2d/posts/304e601878bc