昨日、検定の合否採点が無事に終了して、受験者全員の方へその結果をお伝えし終えることができました。参加者の皆さん、日曜のお休みの所 大変お疲れさまでした!
それで、今回の出題内容は「請求書の自動発行マクロ」の作成ということでやりましたが、
これ、60分でできた人(ちょっと上級の初級者の人)は、もちろん請求書だけでなく、見積書、納品書、領収書、etc、といった、自動化すべきもろもろの帳票出力全般も、ちょっとこれ応用すればいいだけですから、ごく短時間で容易に自動化できる実力が既にあるということが実証されたわけです。
例えば、住所録からの宛名ラベルの印刷だったり、12月生まれの顧客だけ抽出して誕生ハガキを自動印刷するなんてことも、もう楽勝!ですから、色々な分野へ応用できる思います。
それで、今回の問題で取り上げた請求書発行時の可変部分いいますのが
主には、「宛名」と「金額」と「日付」ですね。
これらがない請求書いうのは会計上の意味をなさないわけですし、これらは、必ず出力する請求書毎に変わる可変の部分であるわけです。
これらの可変部分を、どうマクロで自動化すればいいのか?
今回の課題の場合にも、マクロ作りというのはそれに尽きるわけです。
あと、今回出題した中で主なポイントとしましては、
請求リストからの条件抽出と、その連続印刷をプレビューにて行うこと、また、消費税額の計算や請求日の表示、などです。
まず、今回のリスト抽出条件の一つを「締め日」としました。よくあるのが、10日締めとか25日締め、末日締めとかですね。これ請求先の会社によって異なる部分ですが、その締め日毎に請求書は送るものなので、今回まず最初の条件がこれになっています。
それと、2番目は金額。請求リストにある会社でも今月は何も取引なかったいう場合もありますから、当然、その場合には請求書は出しませんから、その条件(請求額が1円以上あるか否か)でも抽出するマクロを作る必要があります。
すなわち、今回のIF条件式は以上の2つになります。
また、請求書の表示内容に関して、問題文にある以下の記述で
P3 ・・・「請求日」(請求処理(マクロ実行)した日の年月日)
今回、不合格となった人の中にはこの請求日と上記の「締め日」とを混同してしまった方も多く見受けられましたが、
これは当然、請求書に記載する日付の基準いうは会社によってまちまちなわけでありますが、けど、この場合の「締め日」は「日にち」だけの情報になりますから、年と月がありません。
年月日の書いてない請求書なんて会計上あり得ませんですから、ここの表示が(15日とか)日にちだけでは明らかに間違いです。
以下は、その部分の正解の一例になりますが、
まずは「マクロの記録」で、
Range("P3").Select
ActiveCell.FormulaR1C1 = "aaa"
↓
Range("P3").Select
ActiveCell.FormulaR1C1 = Date
この修正で、セルのP3に、もし実行日が今日だったらデフォルトの表示形式で 2018/11/18 と出ます。(まぁ、この辺は特に問題はないかと思います。)
例えばこれを、Excelのデフォルト表示の 2018/11/18 でなくて日本語の年月日で 2018年11月18日 と表示したいという問題の場合だったとしたら、
どうしますか?
そうです、これも「マクロの記録」を1度やればいいだけですね。
まずは、「マクロの記録」を開始して、
[ホーム]タブのフォントで[セルの書式設定]の画面を表示して(ショートカットキーでやってもいいです)
[表示形式]タブの[分類]の「日付」と、右側の[種類]から自分が表示したい形式のものを選んで、[OK]して閉じる。
あとは、「記録終了」のボタンを押して、「Visual Basic」で出来たプログラムのコードの中身を見てみれば、
Selection.NumberFormatLocal = "[$-x-sysdate]dddd, mmmm dd, yyyy"
(上記の右側( = 以降)は、選んだ[種類]によって異なります。)
となっていますから、この1行を先ほどのプログラムにただ追加(コピッペ)して、
Range("P3").Select
ActiveCell.FormulaR1C1 = Date
Selection.NumberFormatLocal = "[$-x-sysdate]dddd, mmmm dd, yyyy"
とすればいいだけです。
たったこれだけで、デフォルト表示の 2018/11/18 が、セルの書式設定の如何に関わらず、 2018年11月18日 の表示に変わるわけですから、この作成にも、ものの3分とは掛かりませんね。
では、ここで問題です。
上記の 2018年11月18日 の表示を 平成30年11月18日 にするマクロに直すには、どこをどう修正すれば良いでしょうか?
・
・
・
簡単ですね。
もう一度、「マクロの記録」をやって([セルの書式設定]画面下方[カレンダーの種類]から[和暦]を選んで・・)出来たコードの1行をコピッペ(先ほどの1行に上書き)すればいいだけですね。
Selection.NumberFormatLocal = "[$-x-sysdate]dddd, mmmm dd, yyyy"
↓
Selection.NumberFormatLocal = "[$-ja-JP]ggge""年""m""月""d""日"";@"
簡単ですね。
よって、Excelで可能な表示形式であれば、この方法で何でもマクロで書式の指定ができますから、自分の好きな書式でセルの値を表示させるということが、思いのままに自動でできるようになるわけです。
こんなに簡単に、素早く、手間いらず、だからネットでわざわざ調べる必要性もなく(考える必要すらなく)、短時間でマクロは作れてしまう場合が多いわけです。
よく、ネットや本のライターさんが主張しているような、、「マクロの記録で出来たコードの意味を知る必要性」なんか毛頭必要ありませんね。
要は、いつも私が言っているように「マクロの記録」のうまい利用方法をよく知って、それをちゃんと身に付けることで、コードなんかの余計な部分は見る必要すらなくなります。
それが、そもそも「マクロ言語」と「高級言語」は根本が違う、古来からある「マクロ言語」の良い所です。「マクロ言語」本来の利点を活かしたマクロの作り方いうのをしていう、それ知らないと勉強時間の大損にしかなりません!
全ては、
関係ないところで悩んであなたの貴重な時間を浪費しなくてすむために・・・、です。語学でも何でもそうです。(結局、何の役にも立たなかった文法重視の学校英語での失敗いうのをよく思い出してみてください。笑)
要するに、
「マクロの記録」のうまい利用法を知らないと(理解できてない人から教わってしまうと、)マクロの言語が全く間違った解釈になってしまって、どんなに長い時間を掛けて勉強してもまったくマクロ作れない状態・・になってしまうというだけです。(それ、本屋で買ったVBA本にはよくある話ですね。笑)
皆さん、この辺はもう 重々よろしいでしょうか?
本屋に並ぶVBA本では、
「さあ、これであなたもマクロが読めるようになったでしょ。
あとは、ネットで親切な人が載せてる似たサンプルコード探して、
そのコード解読して直して使えば、もうバッチリですよ!」
なんて言ってる筆者が多いと思いますが、、、違います。
プログラムのコードと言うものは人それぞれなんで、その書き方も
レベルも、実にまちまちです。
第一、自分が昔書いたコードですら今となっては理解容易ではなく
修正難しい場合が多いわけです。半年前に自分が書いたコードに
四苦八苦する思います。
違いますか?(笑)
そもそもが、「コードを読む」というのは”プログラムの流れを読む”
と言う意味でありますので、
VBAの構文がただ読めたところで、そのロジック(思考の道筋や
処理の流れ、平たく言うとフローチャートです。)がわからない限り、
そのコードの理解なんか出来るわけがありません!
うそだと思うなら、そう主張して言ってるVBA本筆者の先生に、
ネットで拾ってきたちょっと長目のコードを(A4に印刷して3枚くらいを)
見せて、
「これ解読して、私がやりたいように直せばいい箇所を教えてください!
何分で出来ますか?」と聞いてあげてみてください。
それで、実際そのコードをその先生の言う通りに修正して、
マクロ実行して上手くいくという可能性は、間違いなくほぼゼロ
ですよね。(笑)
この道25年、現役バリバリシステム屋の私から言わせると、
プログラミングとは「ロジック8割、言語は2割」の世界です。
その2割(に当たる言語の部分)にいくら詳しくなったところで、
他人の書いたコードなんて、読めやしません!言うのは、
真っ当なプログラマーであれば誰一人、異論はないと思います。
残念ながら、
パソコンのインストラクターとか、自称のコンサルタントとか、
VBAの自称第一人者とか・・・、そのレベルのVBA本著者達に
そんな真っ当なプログラマーいうのは、殆ど見当たりません。
ちょっと大きな本屋へ行けばVBA本は沢山並んでいるわけですが、
その殆どが、その著者の個人的な経験から
「私はこうやってマスターしたのだから、あなたも同じように
やればいい」と説く系のシステム開発の基本も知らない自己流参考書
ばかりなので、それらにその方法で成功する証拠というのは、一切
載っていませんよね。検証すらしていない。。。
なので、
本屋やアマゾンでVBA参考書を買って勉強しても、
それでマクロができるようになったと言う人は皆無な理由というのは
まさしく、そこにあります。
みな自己流のVBA参考書の著者達いうのは、方向性間違っとる!
としか、言いようがありません!
何度も言いますが、プログラミングはロジック8割、言語2割、の世界です。
どんなに英語が得意になったところで、翻訳家にはなれるかも知れませんが
けっして小説家に(自分で書けるように)なれるという訳ではありません。