見出し画像

Excel VBA 文法は分るのにプログラムが書けないのはなぜか #1

基礎的な文法は理解しているのに…

Excelを日常的に使用し、関数だけでは実現できないことを自動化させたくてマクロを学んでいる人も多いのではないでしょうか。
スクールに通ったり、ネットや書籍等を頼りに独学する方もいるでしょう。
私も、企業でExcelの研修をしたり、VBAの研修を行ったりしています。

個人レッスンの生徒さんの中には、VBA習得のスクールに通ったのに、目の前の業務を自動化するためのプログラムが書けないと言われることが少なくありません。
変数やサブルーチンについては理解しているし、FORやIFといったステートメントについても、ちゃんと使えるにも関わらずにです。

そういう生徒さんと話をすると、プログラム化出来ないのは、どうすればいいかの発想力が身に付いていないためだと分りました。

発想力はスキル

プログラム化するための発想力が、元々備わっている人もいれば、残念ながらそうでない方もいます。
ですが、発想力はスキルなので、経験を積めば身に付いていきます。
例えば、A列の1行目から20行目まで、ランダムな数字が入っているとして、「最大値を見つける」プログラムを考えてみましょう。

人はどう考えるか

まず、プログラムではなく人の目では、どうやって最大値を見つけるかを考えてみましょう。
人なら上から下まで目を通していき、「あ、これだ!」と分るります。せいぜい20行なら、すぐに判断が付きます。

データが1000行あったらどうでしょう。
上から順にデータを見ていき、「今のとこ8000が一番大きい」と思ったり、「8000を超える8200があったので、今のとこの最大値は8200」という風にして、最後までデータを追い、最終的に最大値を見つけ出すことでしょう。
覚えにくい数字なら、メモ書きするかも知れません。

人の考え方を明確にする

プログラムで実現する場合も、人が行うのと同じことをコード化することになります。
人が行ったことを挙げると
(1)上から最後まで順にデータを見る
(2)その際、とりあえずそれまでの最大値を暫定値として覚えておく
(3)暫定値を超える数字が出てきたら、暫定値を変える
(4)データの最後まで確認したら、暫定値が最大値として決定される
ということになるので、
(1)に対しては、データの最初から最後までのループが必要
(2)に対しては、暫定値を入れて置く変数が必要
(3)に対しては、暫定値と現在チェックしてる行の値を比較し(IF文)、現在の数字が大きければ暫定値の変数に代入する
(4)現在、暫定値を入れておく変数に入ってる値が最大値
というロジックになります。

このように、人が行うことを言語化したり、図に描いたりして処理を明確にし、プログラムならどうすればいいのかを考えていくのが「プログラム化への発想力」になります。

さらに、ループするならループカウンタの変数が必要であり、暫定値を入れる変数も必要になることが分ります。
最後は、最大値をセルに書き出すのか、MsgBoxで表示するかは業務次第です。

スクール等では、残念ながらプログラム化するための発想力を身に付けるためのカリキュラムはないのでしょう。
最大値を求めるロジックを教えるなら、最初に暫定値を使う方法を説明して、「各行で暫定値と比較するにはIF文が使えますね」という進め方なのかも知れません。


いいなと思ったら応援しよう!