VBAの変数の宣言の位置について、下記の記事を拝読させていただき、大変勇気をもらったので、紹介させていただきます。
VBAのコードを書くときに変数をsubプロシージャの最初にまとめて書くということについて、もやもやしていたので、それが解消された気がしました。
記事のタイトルこそVBAの宣言の位置となっていますが、今回の話題の一番の肝となる考え方は「コードは処理の塊ごとにsunプロシージャに分けましょう。」ということだと思いました。ローカル変数を使用前に宣言して、その意味的な塊をsubプロシージャで分けていけば、必然的にそのsubプロシージャの中ではローカル変数が先頭に来るようになると思います。
つまり、ローカル変数を使用直前に宣言すれば、結果的にプロシージャの先頭にまとめられるということです。
どの程度の塊でsubプロシージャ(もしくはfunction) にまとめるか
まだ、記事を読んだ段階で実践しての考えではないのですが、私はfor文毎にsubプロシージャで分けるくらい細かいレベルで良いと思いました。(追記:だたし、やりすぎると逆にコードが細切れになってしまい可読性が悪くなってしまうので、全部が全部ではないと思います。)
例えばfor next 文で使用するイテレーター i は大抵の場合そのfor next 文だけで使用される一時的な変数であるのに、そのプロシージャ全体に影響するので、他のfor next 文を使用するたびに j k l と変数が増えていってしまうのはなんだかなという感じがします。
最初に紹介させて頂いた記事と同じ方が書かれた別の記事でプロシージャを呼び出すオーバーヘッドについて言及されています(下記の記事)。ほとんどの場合はsubプロシージャで分けていった方がメリットが高いと思います。
また、データセルの最終行など同じプロシージャの中で何度も使用する値を変数に代入するということもあるかと思いますが、これもその都度関数で取得すれば余計な変数はいらなくなると思います。エクセルにおいてセルのデータの取得はそれほど速度に影響ない(セルにアクセスするのが時間がかかるのではなく、セルにデータを書き込むのが時間がかかる)とのことなので、速度を気にして変数に代入して使いまわす必要はないかなと思います。(下記の記事を参考にさせて頂きました。) もし可読性を気にするのであれば、例えば最終行を取得する処理であれば、そのための関数をfunctionで作成するという手もあると思います。そうすればコードをまとめられますし、どのような処理をしているのか説明変数的な役割も担えると思います。
そもそも最初から"sub"プロシージャだった。
私たちがVBAのコードを最初に書くのはsubプロシージャです。subというくらいなのですから、そのプロシージャの中が沢山のコードで肥大化してしまってはsubではなくなってしまいます。自分が書いているのはあくまでsubプロシージャであることを頭にいれてコードを書こうと思いました。