その当時、参考にしたヘルプや書籍、WEB上のコードはすべて変数を先頭でまとめて宣言していました。なんの疑問も持たずにそういうものだと思っていました。これは言語仕様上変数はプロシージャの先頭でしか宣言できないというものでした。いうことで、20年以上変数を先頭で宣言してコーディングしてきた生粋の先頭宣言派でした。直前宣言派に転向したきっかけVBA関係の掲示板徘徊をしていてもほとんど先頭宣言のコードした。直前宣言のコードをみかけることがありました。そのときの感想は、コードの流れが分断されて読みにくいな、というものでした。考えが変わったきっかけは下記のページを読んでからです。diaryネットや書籍で見かけるマクロでは、変数宣言はプロシージャの先頭にまとめられているものが多い。...https://thom.hateblo.jp/entry/2016/12/12/223708実例を交えて、分かり安く解説してくれてます。すごく納得がいきました。それから、すこしずつ直前宣言に変更していきました。Q&Aの回答も後押しになりました。転向した直後のものなので他の人の考え方も参考になりました。...https://teratail.com/questions/137797imihitoさんの回答に直前宣言のメリットがうまくまとめられてます。モダンプログラミング言語では直前宣言がデフォルト直前宣言が読みづらいと感じたのは、宣言と代入の2行になるからです。started"現在のモダンプログラミング言語はたいてい宣言と初期化(値の代入)が同時にできます。VB6(≒VBA)の後継のVB.Netだとそれが可能です。started"これなら読みやすいです。使うと複数のコマンドを1行に記述できるのでそれを使って下記のように記述できます。started"VB.Netほどスマートではないので、2行で記述するのと比べてどちらが読みやすいかは好みや慣れもあると思いますので、こんな書き方もできるということは覚えておいて損はないでしょう。Nextループのカウンター変数も下記のように宣言と代入が同時にできます。Forステートメント(変数が宣言されているブロック)の外なので変数xは参照できないこのようにモダンな言語では言語仕様としてなるべく有効範囲(スコープ)を狭くできるようになっています。この変数の有効範囲(スコープ)はなるべく狭くするという考え方はモダンプログラマーにとってはほぼ常識といえるでしょう。複雑で長大なソースコードを書く時はこれはとくに重要です。質問に回答したコードです。teratailの回答のコードから少し修正しています。これは直前宣言仕様のコードになってます。これを先頭宣言仕様で記述すると下記のようになります。Subどうでしょうか。短めのコードですのでメリットが明確に分かりづらいですか、前者の方が読みやすいと思いませんか。(一年前のhatenaが見たら前者は読みづらいと思うだろう。結局、慣れたということかな。Next内のCnt変数も直前に宣言すべきかもしれません。Nextループ内で宣言すると繰り返し宣言されることになると思われるかもしれませんが、ループ内に記述しても宣言は一回のみになりますので、この書き方でも正常に動作します。あらぬ誤解を生みそうなのでここまですることはないかなと、ループ内で使用する変数ということでループの前で宣言しておくことでいいかと思います。上で紹介した2つのリンク先でメリットは言い尽くされてますので、付け加えることはありませんが、素直な感想としてメリットを実感できて、今後、先頭宣言に戻ることはないだろうということです。大きなシステムをコーディングしているとき、仕様変更で一部を修正したり、似たような処理を他で使いまわすということはよくあります。そのようなとき、先頭宣言だと、使用しなくなった変数を削除し忘れて幽霊変数が多数存在しているとかなりがちです。使いまわすためにコピーする場合も変数と処理部分を2回コピーするという手間がかかります。直前宣言だとそのような場合の手間が大幅に省略出来て楽できます。補足メリットや具体的な宣言位置について説明不足の部分かありましたので、補足しておきます。直前宣言のメリット現在のプログラミングの常識として「変数のスコープは狭いほどよい」とされてます。その理由としては下記のようなことがあげられます。コードを読むときに考慮する範囲が狭くなり可読性があがる。関数化などの再利用性がアップする、仕様変更時のメンテナンス性が高くなる。処理ブロックの独立性が高くなり、予期しない誤動作を抑制することができる。この重要性は、ほとんどのモダンプログラミング言語では、ブロック単位でスコープを制限できるようになっていることからも分かります。古くからあるプログラミング言語でもブロック内スコープが利用できるように拡張されてきています。Subまでとなるので、プログラマーは意識して変数の使用範囲を限定することで同様のメリットを享受することができます。Withまでと制限できるので積極的に使用すべきです。どの位置か直前宣言といっても何がなんでも初めて代入するすぐ前で宣言しなければいけないということではありません。場合によっては密着度の高いあまり長くない処理ブロックの前で宣言しても問題ないです。For文内で使用する変数をFor文内で宣言すると、ループするたびに初期化されると誤解される場合があるので、For文の直前で宣言するほうがいいでしょう。変数とそれを使用する処理ブロックが離れていると可読性が落ちるので避けたほうがいいでしょう。まとめまだ、変数を先頭で宣言しているなら、一度、直前宣言でのコーディングを1ヶ月でいいので試してみてください。それでも、やはり、先頭宣言の方かいいというのなら、止めませんが、きっと、メリットを実感できると思います。えっ、「変数は宣言しなくてもそのまま使える。」って!それで今まで問題がなければ、それでもいいでしょう。将来、長いコードを書くようになると、きっとどこかで痛い目にあうことは覚悟しておいてください。AMDuetさん、コメントありがとうございます。記事がお役にたててうれしい限りです。いままで慣れ親しんだ書き方から変えるのは、最初は違和感を感じますよね。慣れてくると気にならなくなる。ループ変数、カウンタ等に関しては、私の場合、Accessでの開発がメインですので、そんなに使う機会がないんですよね。データ操作はたいていSQLですることになりますので。いままで気になったことはないので深く考えてはきませんでした。Excelならループで操作する場面はよくありますね。使える場合はなるべくそれを使うようにしています。すれば、iという抽象的な名前でなく実体に即した名前にしようという気になります。関数化するときも変更せずにそのまま使用すればいいように思えてきました。なければならないという合理的な利用は何もないですよね。変更する合理的な利用はないですよね。ないと気持ち悪いぐらいの理由しかない。知らず知らずにそうあるべきだと思い込んでしまう、さしたる根拠もないのに。自戒をこめて頭を柔らかくと思いますね。感じたメリットを挙げましたが、他者が読みやすいかどうか。いう点は常に考える必要があると感じました私も同感です。自分が直前宣言にメリットを感じたといっても、VBAの世界では先頭宣言がまだまだ主流ですので、それも考慮しつつ折り合いをつけていく必要はあるでしょうね。あと、これは愚痴ってもしょうがないことですが他言語を触ることが最近多いのですが、その後、VBAでコーディングすると、なんとかしてよ、MSさんと思ってしまいます。VBAエディターもまったく変更なしで放置状態。使ってますが、機能、使いやすさに雲泥の差があります。同じMS社製のなのでその気になれば簡単に実装できそうに思うですが。1か月時点でもメリットは十分に感じたので、今後も気楽に試し続けてみようと思います。使い続けて、また、何かお気づきの点がありましたか、お気軽にコメントしてください。今後ともよろしくお願いします。いつもお世話になっております先月この記事をお見掛けして、物は試しと一か月間試してみました。総評として、私にはドンピシャでした。上記の処理B関連を関数化しようとすると、記述が飛び飛びで多少面倒なことになります。関数化をあまり意識してないので処理AとBが混ざったような記述になってしまっていたり、あとコーディングの期間が空いたりすると猶更困ったことになります。いうのは私にとって実装面で大きなメリットを感じました実際に試した手触りとしては、やはり最初は読みにくさが先行しました。直前宣言がしっくりきました。この辺りは好みが強く出そうだな、と感じます。(私も自分ルールに完全に沿う訳ではないですし)感じたメリットを挙げましたが、他者が読みやすいかどうか。いう点は常に考える必要があると感じました>For文内で使用する変数をFor文内で宣言すると、ループするたびに初期化されると誤解される場合があるの>で、For文の直前で宣言するほうがいいでしょう。いう点も忘れてはいけないですね(私の例ですみません)1か月時点でもメリットは十分に感じたので、今後も気楽に試し続けてみようと思います。コメントをキャンセルメールアドレスが公開されることはありません。