今回は、少々勉強がすすんで来て、ある程度マクロが書けるようになってきた皆さんへ(初~中級者レベルの人へ)「上達を阻む原因」と題しまして、特にそうした皆さんが陥りやすい注意点を一つアドバイスしてみたい思います。
※なお、以下の内容はまだ始めたばかりの初心者・入門者の人でありましても、今後の(近い将来の)大変参考になると思いますので、ぜひ一読しておいてください。
で、前回に初心者が中々始められない原因の多くが、よくばって「いっぺんに勉強しようとすることだ」と言いましたが、
今回お話しする「上達を阻む原因」というのも、実はこれもほぼ原因は決まっています。
それは何かと言うと、
ある程度慣れてマクロが書けるようになってきた人の多くが、決まって「よく見せようと背伸びしようとする。」という所にあります。それが、初~中級者の上達を阻む、殆どの原因となっています。
「もっと上手くプログラムを書きたいです。」
「もっとシンプルにすっきり書けるように上達したいです。」
「よりすっきりしたプログラムにする方法を指導ください。」
私宛へのメールでも、これらはよく聞くフレーズなんですが、ある程度マクロが出来るようになってくると、多くの人がそう考える(悩みを持つ)ようになってくるわけです。
これは、ごもっともです。その考え方自体は実に真っ当だとは言えます。
けれど、よく考えてみてください!!
日本語は言語ですが、マクロの言語であるVBAのプログラムもまた言語です。
日本人なら誰でも、もう何十年となく長年書き続けてきたであろう日本語の文章を、あなたはそんなに
”うまく!シンプルに!すっきりと!”なんて書けているんですか?
私なんかは、もうかれこれ14年間もここで文章書き続けてきているわけですけれど、、
今だに、自分の満足いくような、うまくてシンプルですっきりしたメルマガの文章なんか、書けた試しは一度もありませんよ!(笑)
いくら書いても(何十年と書いていても、)書けば書くほど、すっきりとは逆に”くどくど”した文章になってしまう・・・。後で必ず、いつも後悔しきりです。。
小学校の作文からはじまって、日本人なら誰しももう何十年となく沢山の文章を書き続けてきているわけと思いますが、そんなに上手く簡潔な文章書けてる人なんか、滅多に居るわけではありませんから、
それをさて置きにして、プログラムのコードに限ってはそうしたい、すっきりさせなければならない・・・と、そんな無茶な考えをしてしまう人が非常に多いわけです。
我々ビジネスパーソンいうのは、何かの提案書やら報告書やら、日々何十通も書いているメールにしろ、常に簡潔でスッキリした、うまい日本語の文章を書くということに迫られているわけでありますが、
実際、そんなにうまい文章なんていつも書けてるわけではないわけですし、私の場合も、それはたまにたっぷり時間を掛けて書いた渾身の提案書や渾身のメルマガ内容ならばさて置きですが、
たっぷりの時間と、自分の書いた文章を上司やそれなりの人にチェックや校正をお願いできる時であればいざ知らずですけれど、日々仕事で忙しい中で、なるべく時間掛けずにちゃちゃっとメールを書くとか、上手い文章というよりも、素早く書くという速さの方が
よほど重要であるのには間違ない思います。
それだけ、上手い日本語の文章書くことというのは、難しく、時間も掛かるものであるわけなので、それは、プログラミングのコードの場合でも、しかりです。
私は、システム開発の現場やら何やらで、かれこれもう1万回以上ものプログラムのレビュー(他人の書いたプログラムをチェックする事)というのをやってきましたが、正直、プロのプログラマーでも早々にうまくシンプルですっきりと、なんてコードが書けてる人間いうのは極めて少ないです。
なので、余ほど文章上手で文才があって、普段から短時間でも上手い日本語の文章が書けるという人であればプログラムの場合でも、それ目指すいうのは全然構わないとは思うんですが、、
自分の書く日本語文章を鑑みて、とにかく、”簡潔で上手い文章書くいうのは、難しく時間も掛かるものだ!”その認識を、まず持つということが重要かと思います。
そうではない人まで、それを目指して「うまく書こう」と背伸びしようとすればすればするほど、どんどん文章書けなくなっていくものですね。”うまく”と考えると途端にペンが進まなくなるわけです。
それで、そんなことを気にしなければ、ある程度の初心者レベルのマクロであれば、せっかくもうどんどんスラスラ作れるようになってきたとういうレベルであっても、この背伸び心が芽生えることによって、マクロ作りのスピードが大きく鈍化してしまうことになるわけです。
”もっと上手く、もっとシンプルに、もっとスッキリと、”
そう考えれば考えるほど、日本語の文章と同じで途端に書けなくなってきます。それこそが、初~中級を迎えた皆さんにとっての最大の鬼門であるに他なりません。
うまいコードが書ける人間だという自慢や、自分をよく見せたいという邪念は、何事に於いても同じ思いますが、自分自身の為には早く捨てたほうが良い思う次第です。
そもそも、そうした皆さんが目指すべきマクロの上級者とは、どんどん自動化の出来る人であって、きれいにすっきり書けることなんかでは決してないわけですから、(違いますか?)
見てくれは気にせずに、どんどん書く、どんどん便利なマクロを、あなたやあなたの会社の業務効率化に役立つマクロを数多く作っていく、ぜひそれに徹してください。
マクロの上達とは、プログラムのうまいコードを書けるようになることでは、断じてありません!PC仕事に役立つマクロを、もっと沢山完成させて、もっともっと大きな(高度な)業務効率化を図っていく・・・。ということに他ならないわけです。
それこそが、真に高度な「マクロの上級者」なのであって、初~中級者の皆さんが今後、目指すべき正しい姿だと思います。コードをうまくスッキリ書けるより、数多くの役立つコードがより短時間で書ける、作れる、その方がどんなに仕事上のメリットが大きいことであるか知れませんのは、確かですね。
このメルマガを読んでくださっている読者の初~中級者の皆さんには、”上手く書くよりどんどん書く”これに徹していただいて、(コードの見てくれなんて小学生の作文程度で全然構わないわけですから、、)
どんどん便利なマクロを書いて、業務効率化になるマクロを数多く生み出していく、それに徹して行ってくださいね。
巷のVBA先生みたいな人達は、自分の書いた数行の短いVBAのコードを示して、「これスッキリ書けてるでしょ!これ見習いなさい!」なんて、自慢げに言ってる人って居るかと思いますけど、、
そんな人でも、少々長いコードになったら間違いなく、その中身はもう”ぐちゃぐちゃ”です。断言します!それが証拠に、そう言ってる人いうのはネット上に長い(数百行~数千行といった)VBAのコードは、決して載せません。(笑)
参考書のライターでも、本に載せてる少々長文のサンプルコードになると、途端に間違えだらけの動かないコードだったりする思います。(しかも、本に載せてるコードいうのは、たっぷりの時間を掛けて、出版社の校正もなされたものなんですから、皆その程度です。(笑))
ぶちゃけ、毎日朝から晩までプログラム書いているプロの職業プログラマーだって、そんなにスッキリうまいプログラムが書けているプログラマーなんて早々には多くは居ませんですから、
そんな、書くのがプロの本のライターや、本職のプロのプログラマーでさえも難しいことを、素人がやろうとするから必ず失敗しますし、書けなくなります。背伸びしようとする気持ちが上達を阻むわけです。
ちょっと長くなってくると、大抵がぐちゃぐちゃしてくるいうのが、コンピュータ言語の文章(すなわち、プログラムのコード)です。短いもの、または、しこたま時間を掛けて書いたらものであれば別なんですが、そんなネットの見せかけコードに騙されてマネをしようとはしないよう、くれぐれも気を付けてくださいね。
それで、ちょっと話は前後しますが、
そもそも、根本的に上手くスッキリした読みやすいプログラムっていったいどういう書き方なのか?
という話です。
例えばですが、ネット上でそのように「スッキリ書け!」と言ってるタイプの人の書いたコードの例文を見ますと、
【例文1】
++++++++++++++++++─
Worksheets("Sheet1").Range("A1").Copy Worksheets ("Sheet2").Range("C2")
++++++++++++++++++─
これを、1行でスッキリ書けていて見やすいと言ってるような人が多く居る思いますが、ベテラン読者の皆さんならもうよくご承知と思いますが、これは当講座では、
【例文2】
++++++++++++++++++─
Worksheets("Sheet1").Select
Range("A1").Select
Selection.Copy
Worksheets("Sheet2").Select
Range("C2").Select
ActiveSheet.Paste
++++++++++++++++++─
必ずこう書きます。
上記の2つの例、どちらも実行結果は同じですが、当講座では必ず後者【例文2】の方の書き方を奨励しています。必ず、です。
この両者の違い、わかりますか?
わかり易く、上記の2つの例文のおのおのを日本語の文章に書き表してみますと、
【例文1】が、
ワークシートのSheet1のセルのA1をコピーしてワークシート
のSheet2のセルのC2へそれを貼り付ける。
で、
【例文2】は、
ワークシートのSheet1を開く
セルのA1をクリックする
コピーする
ワークシートのSheet2を開く
セルのC1をクリックする
貼り付けする
となるかと思います。
前者は、色んな命令を詰め込んだ だらだら長い文章で、後者は、コンピュータへの命令が1つ1つ短文に分かれて改行された私好みの、いわゆる箇条書きの文章です。
このどちらが好みかは人それぞれですから、決してこの書き方を強制するというものではないですが、プロの私としては、これは当然、後者の方が好みです。
第一、これであれば「マクロの記録」で自動で書けるコードを大きく書き直す必要もなく、そのままで(必要に応じた微修正だけで)色々活用できます。
ネット上やVBAの参考書では、何故だか前者の方の書き方を奨励している人が非常に多いですので、最初わたし
「何でなんだろう?」と、そう不思議に思ったわけですが、
私のようなプロの職業プログラマーで、プログラマーからExcelのVBAに入った人であれば、必ず私と同じに後者の書き方を好みますので、それは間違いない思うんですが、、これはどうも、いわゆるExcelのワークシート関数が影響しているものと思われます。
Excel好きが高じてプログラムにまで手を伸ばし、それでVBA教えるまでなっていった人達いうのは皆、関数が得意で大好き思いますから(少々長くて複雑な数式でも関数1行に何でも詰め込もうとしますから、(笑))、
要するに、数式の処理はづらづらと横1行に長く書いていく・・・というスタイルに慣れ親しんでしまっているわけなんですね。どんなに長くて複雑な処理をする場合でも、改行も段落分けも出来ないセルに書き込む関数いうのは、とにかく何でも横長の1行に詰め込む必要がありますから、それが正しいのだと。。。
これが、プログラマーとの大きな違いです。
VBAも含めてプログラムのコードというものは、改行や段落分け等が自由に出来ますから、1行に何でもかんでも詰め込むような書き方は好みません!
なので、Excelからではなくて、私のようにプログラミングから入った人間は皆、そうしたプログラミングの利点を生かした書き方いうのをVBAの場合でもしますから、前者【例文1】の横長1行の書き方ではなく、後者【例文2】の縦長改行のコードを好むというわけなんです。
これは、前々からここで何度も言ってきていますように、日本語の文章と同じで、箇条書きです。改行や段落のない長々とした文章で書くよりも、箇条書きで短文に分けて、しかも、できれば1行には1つの目的のみで(1つ1つの命令に分けて)書くいうのが、どんな文章でも文章としては断然見やすくて理解しやすくなると、私は思う次第なんです。(違いますか?)
だから、日夜複雑な処理を求められている我々プロの職業プログラマーいうのは、改行や段落分けの出来ない、何でもかんでも1行に処理詰め込むしかない関数いうのは、決して好まないものです。
関数から(Excelから)VBAのプログラミングに入った人は、どうしてもそう(横長の1行詰込み型の関数スタイルが見やすい・・・)思ってしまっているように思えます。
常識的に、ビジネス文書の書き方でも、わかりやすい、理解しやすいと考えてみるならばこれは明白と思いますですから、、私はそのようなVBA界隈で起きている誤った解釈や風潮には、大変憂いてなりません。なので、改めてそう言っている皆さんに問いたい思います。
改行なしで1行に多くの命令を詰め込んだ方がプログラムはすっきり(行が少なくて)わかり易いって、本当ですか?
少なくとも、私なんかはプログラマー歴が長いですから(これは日本語の文章と同じで)、短く箇条書きが好みです。その書き方の方が断然、文章でもプログラムのコードでも、見やすくて理解しやすい思って、過去も今後も、このメルマガではそのように書いていきます。
で、前回のプログラム例でも当講座では
n = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To n
こう書いているんですが、これを
For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
こう書いて教えてる人も多いです。
後者は、「ループを回す」と「データのある最後の行を取得する」という2つのことを1行で同時にやっているわけです。言うなれば、これはテレビを観ながらスマホやるとか、ご飯を食べながらスマホのゲームをやるとか、最近の若者にはよく見かける光景ですよね。(笑)
先に述べてきましたプログラムコードの本来の「シンプルの意味」をよく理解した上で、できるだけ1行は短文の1命令に分ける。そこだけ注意して書けるよう心がけることを、お薦めします。
For i = 1 To Cells(Rows.Count, "B").End(xlUp).Row
と書くのではなくて、
n = Cells(Rows.Count, "B").End(xlUp).Row
For i = 1 To n
ですよ。よろしいですねっ!
あとは、綺麗なコードという意味では、いつも口をすっぱくして言っている For文 や IF文 の中の字下げですね。段落分けをしたら同じ階層の行の頭はきちんと揃えておくと間違いなく、美的なコードになりますし、ループや分岐の処理が区別し易く解り易くなります。
あとまた、「構文のすっきり」と「ロジックのすっきり」は、分けて考える必要があります。今回の話は、全部が前者の関連の話です。後者の「ロジックのすっきり」の話しに関しましては、また話しが大変長くなる恐れがありますので、もし機会がありましたらまたお話してみたいと思います。
最後に、今日の話のまとめになりますが、
とにかく、世間では「マクロが少々できる」というだけで凄い人なんですから、それで背伸びをしたり、他人の目を気にして見てくれに走って書けなくなるなんて、実に勿体ない話です。そんなことは気にせずに、どんどん書く、どんどんExcelの自動化を達成していく、それだけを考えてやっていくようしてください。
しかも、プログラムのコードいうのは、自分の苦労の歴史が垣間見えるヘタな書き方や、コメントアウトの足跡を残した(汚めの)ほうが、かえって将来の自分の為にはなる思いますよ。
大変話長くなりまして恐縮ですが、
本日は以上です。
たかぼうさん、こう私に反論するぐらいですから、相当に自信のあるVBA上級者かと思いますが、
だからと言って、Excelの自動化できてます?
Excelマクロの上級者とは、Excelの作業を短時間でどんどん次々に自動化していける人の事を指して言うのでありまして、
時間掛かる書き方するVBA上級者を、マクロ上級者とは呼びません!
当講座では、そのように中級者や上級者の定義をしています。
『最初わたし「何でなんだろう?」と、そう不思議に思ったわけですが、』
とありますが、
例文1と例文2は、同じ処理ではありませんよ。
例文1の書き方はさすがにどうかと思いますが。
シートやセルを選択(select)するかどうかというのは、大きな違いです。
マクロの記録をそのまま加工せずに使うというのはコードを書けない初心者がやる事で、中~上級者に推奨すべき事ではないかなと思います。