[[20220924005855]] 『モジュールレベルでの宣言』(すずすず) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『モジュールレベルでの宣言』(すずすず)

ベテランの方はどちらがベストと感じていらっしゃるのか伺ってみたく、投稿しました。
ひとつのモジュールに、複数のSubプロシージャが入っています。
どのプロシージャ内でもDim i As Longなどの同じ変数を宣言をして使っているのですが、
モジュールレベルで宣言も可能だということを最近知りました。
モジュールの先頭にDim i As Longなど纏めて宣言しておけば、
行数カットできてスッキリ見えるかもと考えているのですが、
今後、業務を引き継いだりすることを考えると、読みにくいのかなとも懸念しています。
一般的な書き方など、皆さんのご意見いただきたいです!

< 使用 Excel:Office365、使用 OS:Windows10 >


↓が参考になるかもしれません。
http://officetanaka.net/excel/vba/variable/05.htm

>行数カットできてスッキリ見えるかも
実際のコードを見ていないのでわかりませんが、行数を少なくすることだけが正義でもないので、ちゃんとインデントを付けるとか、変数名に意味を持たせるとか工夫の仕方はあるように思います。

(もこな2) 2022/09/24(土) 01:53


 コードの見栄えを整えるために、モジュールレベルの変数を使うということはありません。

 自分がモジュールレベルの変数を使うのは例えば以下のようなときです。

 Mainプロシジャとサブプロシジャ Sub_AとSub_Bがあるとして、
 Sub_AとSub_BはMainプロシジャからコールして使うとします。

 Sub_AとSub_Bの間では、相互にコールする/される ことはないが、変数を共有しないといけない
 という場合に、Sub_AとSub_Bを一つ別モジュールにして、モジュールレベル変数を使います。

 Mainのモジュールと、Sub_A、Sub_Bのモジュールは別モジュールを別モジュールにすることで、
 Mainのモジュールからは、Sub_A、Sub_B間で共有する変数は見えなくします。

 '------- Main Modulbe -----------
    Sub Main()
      Dim a, b
      Call Sub_A(a)
      Call Sub_B(b)
    End Sub

 '------- Sub Modulbe -----------   
    Dim CommonVariable          ' この変数は Sub_A、Sub_Bで共有するが、Mainからは見えない/使わない
    Sub Sub_A(b)                         
        CommonVariable = ・・・・
    End Sub
    Sub Sub_B(b)
        Debug.Print CommonVariable
    End Sub

 こういう場合、Sub Module をクラスモジュールにしてしまうことが多いので、
 モジュールレベルの変数を標準モジュールで使うことはほぼありません
(´・ω・`) 2022/09/24(土) 06:30

 質問の意図としては、複数のプロシージャでほぼほぼ使うであろう、
 カウンタ変数の宣言を全部のプロシージャでするのって無駄だわー、
 まとめて最初に宣言すればいいじゃん?ってことですよね?

 私はベテランでもプログラマでも無いので参考にはならないと思いますが、
 他の人がコードを見る可能性があるのなら、個人的には、毎回宣言した方が良いのかなと思います。
 二重の宣言とか変数の型が違うだとかが生じないですし。
 社内ルールで、カウンタ変数は i,j,k でLong型で統一する、他の変数は2文字以上を原則とする、とかあれば、また違うかもしれませんが。
 それでも守らない人もいると思いますが。

 行数について、既にご指摘ありますが、カウンタ変数の宣言を1回にまとめたら行数がスッキリすると感じられるほどに、
 同一モジュールにプロシージャが存在しているのなら、モジュールを分けるという事も視野に入れるとか。
(みかん) 2022/09/24(土) 07:22

 みかんさん始め皆さんの意見に賛成です。
 私もプロシージャレベル変数でよいと思います。
 モジュールレベル変数とか、さらにPublic変数とかの使用は必要な場合以外は避けるべきでしょう。

 カウンタ変数であれば、例えば、
   Dim i&, j&, k& 
 のような書き方にすれば、宣言が複数行にもならず、コンパクトに書けます。
 (&は Longの型宣言文字)

 また、仮にカウンタ変数でない場合は、モジュールレベルにしたら、
 逆にそのつど初期化してから使うように気を使わないといけませんよ。
 それを漏らすとバグの元になります。
 また、デバッグ場面では、モジュールレベル変数だと、
 他のプロシージャでの処理も確認しなければならなくなります。
 良いことは余りありません。
  
(γ) 2022/09/24(土) 09:19

昔遅くなると読んだので、使わなくなった。
各モジュールで使っていると、同じ変数名を宣言する事も。
(ぷりぷり) 2022/09/24(土) 18:06

私の場合は、下記のように心がけています。

変数の適用範囲はなるべく狭く。

変数宣言と変数の使用位置はなるべく近く。

適用範囲が広いと、他でつかっていないか、他で変更されていないかなど気にする必要があります。それを見落とすとバグの元になります。

変数宣言と使用位置が遠いと、コードを読むとき、宣言位置と使用位置をいったりきたりしないとだめなので読みづらいです。

複数のプロシージャで値をやりとりしたい場合も、プロシージャレブルの変数は使わずに、引数で渡すようにします。

行数を節約するためだけに、モジュールレベル変数を使うことは絶対ないです。
(hatena) 2022/09/24(土) 18:28


皆さま、ご返信ありがとうございます。
ゆっくりじっくり考えながら、ひとつひとつを読ませていただきました。
そしてこれは、楽をするための書き方じゃなく、
他に深い用途があるんだということを、よーく理解しました。
他人にも優しいコードがかけるよう、精進しなければ…

勉強になりました!
ありがとうございました!

(すずすず) 2022/09/25(日) 00:24


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.