このところ、地元の整形外科で、理学療法士さんのセッションを受けています。
元々は、「古傷の左足ふくらはぎの肉離れをかばってジョギングしていたら…背中の肉離れをしてしまった」というのがきっかけ。
よくやってしまうパターンなので、身体の扱い方を根本から見直そうかと。
理学療法士さんのセッションは、対処療法でありつつも、ストレッチなり、軽い筋トレなり、予防のためのワークもいろいろ教えてもらえることが魅力です。
セッション時間は短いのですが、かえって、そのほうが受けやすくてよいな、と思います。近所だと、移動も苦になりません。
今日は、レベル的には、「中の下」くらいのスキルの方向けのアドバイスです。
とある受講生さんとのやりとりから。
実務で書かれたマクロについての、「どのコードが原因なのかお教えいただけますでしょうか」というご質問。
こういうご相談、ちょこちょこ受けます。
小川先生
勘定科目のデータを配列motoに格納して、一列目にある勘定科目をキーにし、情報(科目名や他システムでの科目名)を、任意のセル(他シートを含み、科目名表記が始まるところをActivecellにしてマクロを実行すると、リスト(moto)の何列目の情報を勘定科目から見て何列目に表示したいかをInputboxで変数として格納し、出力をする
というコーディングをしているのですが、motoに格納したデータのあるシート内は成功するのですが他シートだとうまくいきません。
どのコードが原因なのかお教えいただけますでしょうか
よろしくお願いいたします。
とのこと。
添付用に見せていただいたプログラムは、以下のようなものでした。
↑
フォントサイズを8ポイントにして、ようやく全体を表示できました。
読みにくいですね。
というか、読まなくてよいです。これは、…僕も、読もうという気が起きないです (-_-;
こういうコードでやることは、以下の4つ。
[1] Option Explicit を先頭につける。
[2] sub … end sub 内は一段インデントを。
[3] そのほか、インデントいろいろダメなので、全面的にみなおす。
[4] 不必要に複数行改行が入っている箇所は詰めて書く。
ということで、僕のほうで整形してみました。
以下のとおりになりました。
↑
フォントサイズ、14ポイントにしても、全体を表示できています。
どういうロジックで処理を進めるプログラムなのか?が、プログラムの形からも分かりやすくなりました。
これなら、「さあ、おかしいのはどこだ?!」と、じっくりコードを読もうという気も起きようというもの。
質問者さんには、手なおししたプログラムをお渡しするまではしませんでした。
そのかわり、上記[1]-[4]を行うようアドバイスしました。
「上記[1]-[4]を行うだけでもだいぶコードの見落としよくなりますし、自力解決できるようになるかも」と書き添えつつ。
すると、2時間もしないうちに、以下の回答が。
小川慶一さん:
ありがとうございました!発見してなおせました。
解決!! ヾ(´ー`)ノ
[1] Option Explicit を先頭につける。
[2] sub … end sub 内は一段インデントを。
[3] そのほか、インデントいろいろダメなので、全面的にみなおす。
[4] 不必要に複数行改行が入っている箇所は詰めて書く。
上記、やるとやらないとでは大違いです。
[1] Option Explicit を先頭につける。
↑
これは、宣言しないで使っている変数を検出するのに必要。
いただいたプログラムでは、実は、
‘科目リストから科目の記入。セル確認
より下で登場してくる変数は、ほとんど、宣言されていません。
Option Explicit を入れておかないと、書き間違いとか検出できません。
ミスの元です。
[2], [3], [4]は、すべて、整形の基本。
整形されていないマクロは、問題があってもみつけにくいです。
頭の混乱の元です。
逆にいうと、マクロがしっかり整形されていれば、そこそこの問題なら自力解決できます。
自力解決できれば、上級者に質問する手間も、返事を待つ時間も省けます。
それに、解決できた本人にとっても、自信につながります。
マクロの勉強で挫折しそうなあなた、実務で思うようにアイデアが湧かないあなた。
そんなあなたのための、マクロが思いどおりに動かないときにチェックすべきポイントは以下の4つです。
[1] Option Explicit を先頭につける。
[2] sub … end sub 内は一段インデントを。
[3] そのほか、インデントいろいろダメなので、全面的にみなおす。
[4] 不必要に複数行改行が入っている箇所は詰めて書く。
行き詰まったら、上記[1]-[4]をしっかりチェックしてください。