遅くなりましたが、10日の日曜日に実施いたしました 「初級マクロ検定」の結果報告です。 今回も、想定合格率を6割に設定して作ったレベルの問題を 出題いたしましたが、結果、5割を少々下回る 合格率45.8% の結果となりました。 予想外に低調な合格率となってしまったその原因ですが、 それは実に今回明確でした。 不合格者の半数近くに皆同じちょっとしたミスが見られ まして、もし、そのちょっとした共通の間違えさえなければ、 今回の合格率は7割を超えたかと思われます。ので、、 本日は、不合格者の皆さんに多く見られたミス初級者が間違えやすい部分について、述べてみたい思います。 その箇所と言いますのは、ひと言で言えばプログラミング のバグでよく見られる「初期化」のミスです。 以下に、これ詳しく解説します。 「初期化」とは、すなわち「使い始める前の状態に戻すこと」の意味に なりますが、プログラミングの場合、主にこれは 変数(データの入れ物)を使う場合によく使われる 言葉になります。 ただ、ここで皆さんと勉強しているプログラミングというのは Excelのプログラミングになるわけですから、 そのデータの入れ物は主にExcelのシートの中だということになります。 これこそが、一般のプログラミングとマクロのプログラミングとの最大の違いだと言っても過言ではありません! すなわち、今回の初期化はシートの初期化 「シートの状態を元に戻すこと」との意味になります。 それで、今回の試験問題に関して具体的には、 一度マクロを実行して処理した結果(C列に出した出力データ) が、2回目以降のマクロ実行時に、それを最初に削除しておく 必要があるわけですが、 データ数が固定、もしくは数減らないという前提条件があって 出力欄の全データは必ず上書き、もしくは新規の書き込みだけ との保証がある場合には、わざわざ前回の出力データのクリア というのは必要がありません。 ですが、今回のように「データ数が減る場合も想定せよ」との 場合になると、出力データのクリアというのが必修であるわけ です。 で、不合格者に多かったこの部分のプログラムが、 n = Cells(Rows.Count, "A").End(xlUp).Row Range("C1:C" & n).Select Selection.ClearContents といったものです。これ、実に惜しいです。 この場合に消す必要のある前回の出力データの数は(データの 最後の行になる n に入れるのは)、A列(入力列)ではなくて C列(出力列)の行数になります。 よって、正解はこの1行目の列名指定の部分を、ただ単に n = Cells(Rows.Count, "A").End(xlUp).Row ↓ n = Cells(Rows.Count, "C").End(xlUp).Row (AをCに変えただけ)これだけです。 けど、 これは、コード的には上記ほんの1文字違いの些細なミスのよう でもありますが、プログラミングの根幹を成すロジック(処理の 考え方)としては、バグの原因になりやすい大きなミスと言える 間違いです。 プログラムのロジックとしては、これは言うなれば、 n = Cells(Rows.Count, "A").End(xlUp).Row '今回の入力数 m = Cells(Rows.Count, "C").End(xlUp).Row '前回の出力数 となりますので、この2つの変数(入れ物)は分けて考えた方が いいわけです。 で、 この様な考える時(ロジックの思考時)に是非おすすめしたい 方法が、とにかく「紙に書く」という方法です。 私の本をお持ちの方は是非169ページにある「上達のヒント」 というページをみて頂きたいですが、 初心者がこの様な図形でのフローチャートを書くというのは 中々難しい思いますから、次の170ページにある説明を参考に して日本語の文章で(箇条書きで!)書く、 且つ、これは何も紙上でなくてもいいですから、プログラム の中に「コメント文で書く」すればよいわけです。 たとえばですが、 'これ、どこまで消せばいいのか? って、自分のプログラムのどこかに書き込んでみるのです。 ロジックは書かないと絶対にダメです。頭の中にあるだけだと、 「設計図のない家はうまく建ちません!」ですから、それは、 いつまで経ってもマクロ作りが上達しない人の一つの大きな 原因にもなっています。 ぜひ、このようなロジックの考え方は紙に(コメント文に) 書いて、「文字にして考える」というクセを付けるようして ください。頭の中だけで考えてやっていると、必ずミスが起 こります。 で、この場合には、 'これ、どこまで消せばいいのか? こうコメント文で書き込んでおけば、必然的に 'これ、どこまで消せばいいのか?→それはC列の全部だ! ってなりますから、そしたら、わざわざ「データの最後の 行まで」とする必要性なんかないのに気付く思います。 C列のデータは全部消しちゃえばいいだけだ~、と。 よって、ここは「マクロの記録」でC列削除を記録して 自動でできる(マクロの記録→列名をクリックしてC列全体を 選択→Delキー押す→記録の終了、この手順で) 〇 Columns("C:C").Select Selection.ClearContents このコードを用いれば、たったこの2行のそのまんまで済みます から、マクロの記録だけやれば何の修正の一つも必要ないです から、 × n = Cells(Rows.Count, "C").End(xlUp).Row Range("C1:C" & n).Select こんな面倒は一切必要なかったことに気付き、一瞬で作れる プログラムになるわけです。 急がば回れ!ちょっと立ち止まって設計図を紙に書いてみる (コメント文で書き込んでみる)、素早く効率よくマクロを 作る為のコツがこんなところにもあるわけですね。 以上、本日は今回の検定で特に合否の明暗を分けました 「初期化」に関する解説でした。 なお、合格者の皆さんには先週に「合格証書」をお送り 致しました。合格した皆さん、おめでとーう!! 惜しくも不合格だった皆さんは、今回の説明を実践して ややこしい処理は「コメントに書く」この練習して頂いて、 次回(たぶん秋頃に)またチャレンジをお待ちしてます!! → マクロ検定の紹介ページへ
最新の画像[もっと見る]
- 80代の年寄りにVBAが出来るわけがない? 3年前
- 鎌倉殿の13人ー義経の逆落としの地形 3年前
- 鎌倉殿の13人ー義経の逆落としの地形 3年前
- 鎌倉殿の13人ー義経の逆落としの地形 3年前
- 鎌倉殿の13人ー義経の逆落としの地形 3年前
- 鎌倉殿の13人ー義経の逆落としの地形 3年前
- 関ケ原の合戦場をデジタルマップで見ると 3年前
- 関ケ原の合戦場をデジタルマップで見ると 3年前
- 関ケ原の合戦場をデジタルマップで見ると 3年前
- 上田城の3Dデジタルマップ 3年前