引数とは、プロシージャから別のプロシージャを呼び出すときに計算や処理の元となる値を渡す仕組みです。
VBAエキスパート公式テキストのExcel VBAスタンダード(2019年版)には、モジュールレベル変数を利用することで、引数を使用しなくても、複数のプロシージャ間で値を共有できることが紹介されています。(2009年版には、記載されていませんでした。)
確かに、モジュールレベル変数を使うと、引数で問題となる参照渡しと値渡しに頭を悩ませることもなくなり、非常に便利です。
しかし、引数を明確に使用した方が、変数を変更した場合にどこに影響が及ぶのかをはっきりさせることができ、誤りの発生を防止することができます。
また、モジュールレベル変数は、モジュール内のすべてのプロシージャに適用されますが、常に値が保持されるとは限りません。
このため、値の共有には、必ず引数を使用するようにしています。
なお、引数を使う場合に問題となるのが、「値渡し」と「参照渡し」のどちらを使うかということです。多くの参考書などに書かれているとおり「その違いを理解して、適切に使い分ける」ことが必要なのはもちろんですが、「ほとんどのケースでは値渡しを使うべき」らしいです。(私には、よく理解できていないのですが...)
詳しくは、こちらのサイトを参照してください。
では、VBAアセットではどうしているかというと、「値渡し」(ByVal)か「参照渡し」(ByRef)なのかを明示していません。この場合、「参照渡し」として処理されます。
理由は、「書くのがめんどくさい」し、「書かなくても何も問題が起きない(起きたことがない)から」です。重要なのは、とにかく引数を使うことだと思っています。
こちらのサイトの見解に賛同します。
コメント
モジュールレベル変数の値の保持についての記述を追加しました。
VBAアセットでは、「値渡し」と「参照渡し」を明示しないことを記述しました。