Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 11 Pro : Excel 2019)
変数の定義について
投稿日時: 24/12/26 10:51:41
投稿者: ffftp

こんにちはffftpです。
 
根本的なことを聞いてしまってすみません。
変数をPublicで設定すると、引数を渡さずにファイル内で使用できると認識しております。
 
すべての変数をPublicで設定することがメリットでしかないと思っております。
デメリットは何があるのでしょうか?

回答
投稿日時: 24/12/26 11:16:53
投稿者: simple

https://www.moug.net/faq/viewtopic.php?t=82927
での議論、およびそこで引用されているリンク
https://excel-ubara.com/excelvba1/EXCELVBA408.html
の最後のあたりを参照してください。
つまり、↓です。
> 変数は、極力狭いスコープで使う事が望ましいとされます。
> これは、変数の値を変更したことによる影響範囲は、なるべく狭い方が良いという考えです。
> いくつものプロシージャーを作り、それぞれをCallしている場合、
> 意図しない変数の推移となってしまう事を避けるためです。
> つまりは、バグを減らす為の工夫になります。
全ての変数をPublicでと言う考えを採用されているかたは少ない(いないと言ってよい)と思います。

回答
投稿日時: 24/12/26 12:34:50
投稿者: mattuwan44

引用:
デメリットは何があるのでしょうか?

 
1)変数の初期化をしたつもりがされていない。
2)変数が意図しない値に変えられて(変わって)しまう。
 
ということが起きるリスクがあると思います。
書いた当初は、問題ないかも知れませんが、
1年とか経った後だとどういうつもりで書いたか忘れるので、
デバッグに苦労するかも知れません。
まぁ、よりよいと思われる方法論で書いてみたら
いいのではないでしょうか?
たぶん、経験しないと理解できないと思います。
 
ちょっとメンテナンスしようと思っても、1年前に自分で書いたコードが解読できなくて、
結局、全部新たに書き直すなんてことはよくある話なので。(自分だけかな^^;)

回答
投稿日時: 24/12/26 12:49:03
投稿者: Suzu

ffftp さんの引用:
変数をPublicで設定すると、引数を渡さずにファイル内で使用できると認識しております。

 
最初、何をおっしゃっているのか判りませんでした。
引数無しのプロシージャであれば、引数無し になるのは当たり前ですし・・・と・・
 
通常なら、引数を持たせるプロシージャ であるが
引数ではなく、Public変数 に 引数となるべき値を予め渡しておけば、
プロシージャに 引数を渡さなくとも良い
 
という事ですね。
 
 
まぁ、そういう方法も採れますね。
でも、Public変数という事は、明示的に その変数を解放しない限り
そのVBAプロジェクトが終了するまで 値を持ち続けます。
 
プロシージャレベル変数であれば、そのプロシージャが終了すれば解放されます。
 
変数を、無駄に Public とすると、その分、メモリーを消費します。
また、質問文の様な使い方をする前提で、Public変数としたとき、
その値と違う値を 保持したい時、同じ型の変数を更にPublic変数で宣言しますか?
 
また、使い方によっては、使う前に、いちいち、初期化処理を行う必要がある場合も出るでしょう。
 
Publicにすれば特別であるから、その数は少なくて済みますが
お考えの様に、すべからく全ての変数を Public にしたとき、
それらについて、どんな型の変数で、どんな値を持たせているのか 覚えておく必要があります。
 
開発時にはフローを覚えていて、理解できても、
メンテナンス時に、複数のプロシージャに渡って、変数が使われている場合
   それらを確認しないとメンテナンスが行えませんよね。
 
Publicにすると、すべてのプロシージャに対し、代入を行っている処理を探す必要があります。
 
ByVal 引数付きのプロシージャなら、
そのプロシージャ内で その引数自体を参照はしても、書き換える事はできませんから
【書き換えを行っている箇所を探す】行為から見たらプロシージャ宣言部で判断できので楽です。
 
 
実行環境のメモリ量は 昔に比べたら多くなっていますから、メモリ量を気にする必要はないかも知れません
でも、メンテナンスを考えると、賛同しかねます。
 
 
また、引き合いに出されている 引数 ですが、
フォルダ・ファイルの ツリー構造を 取得する際の様に、再帰処理 を行う場合、
Public で 宣言して、同じ様にできるか? というと、できません。
 
再帰呼び出しの考え方
https://www.moug.net/tech/exvba/0150117.html

投稿日時: 24/12/26 14:06:58
投稿者: ffftp

Simple様 回答ありがとうございます
 
質問内容が的を得ておらず、色々と考えてお答えいただきありがとうございました。
リンクを見て勉強させていただきます。
 
まだ未熟なもので、もっと勉強させていただきます。
 

simple さんの引用:
https://www.moug.net/faq/viewtopic.php?t=82927
での議論、およびそこで引用されているリンク
https://excel-ubara.com/excelvba1/EXCELVBA408.html
の最後のあたりを参照してください。
つまり、↓です。
> 変数は、極力狭いスコープで使う事が望ましいとされます。
> これは、変数の値を変更したことによる影響範囲は、なるべく狭い方が良いという考えです。
> いくつものプロシージャーを作り、それぞれをCallしている場合、
> 意図しない変数の推移となってしまう事を避けるためです。
> つまりは、バグを減らす為の工夫になります。
全ての変数をPublicでと言う考えを採用されているかたは少ない(いないと言ってよい)と思います。

投稿日時: 24/12/26 14:09:37
投稿者: ffftp

mattuwan44さん 回答ありがとうございます
 
経験談まで教えていただきありがとうございました。
リスクはよくわかりました。
 
もっと勉強させていただきます。
 

mattuwan44 さんの引用:
引用:
デメリットは何があるのでしょうか?

 
1)変数の初期化をしたつもりがされていない。
2)変数が意図しない値に変えられて(変わって)しまう。
 
ということが起きるリスクがあると思います。
書いた当初は、問題ないかも知れませんが、
1年とか経った後だとどういうつもりで書いたか忘れるので、
デバッグに苦労するかも知れません。
まぁ、よりよいと思われる方法論で書いてみたら
いいのではないでしょうか?
たぶん、経験しないと理解できないと思います。
 
ちょっとメンテナンスしようと思っても、1年前に自分で書いたコードが解読できなくて、
結局、全部新たに書き直すなんてことはよくある話なので。(自分だけかな^^;)

投稿日時: 24/12/26 14:13:51
投稿者: ffftp

Suzu様 回答ありがとうございました。
 
メモリに負荷がかかる点やデバッグ・メンテナンスで問題がある点などリスクがあることが
よくわかりました。
 
教えていただいたURLなどでもっと勉強させていただきます。
 

Suzu さんの引用:
ffftp さんの引用:
変数をPublicで設定すると、引数を渡さずにファイル内で使用できると認識しております。

 
最初、何をおっしゃっているのか判りませんでした。
引数無しのプロシージャであれば、引数無し になるのは当たり前ですし・・・と・・
 
通常なら、引数を持たせるプロシージャ であるが
引数ではなく、Public変数 に 引数となるべき値を予め渡しておけば、
プロシージャに 引数を渡さなくとも良い
 
という事ですね。
 
 
まぁ、そういう方法も採れますね。
でも、Public変数という事は、明示的に その変数を解放しない限り
そのVBAプロジェクトが終了するまで 値を持ち続けます。
 
プロシージャレベル変数であれば、そのプロシージャが終了すれば解放されます。
 
変数を、無駄に Public とすると、その分、メモリーを消費します。
また、質問文の様な使い方をする前提で、Public変数としたとき、
その値と違う値を 保持したい時、同じ型の変数を更にPublic変数で宣言しますか?
 
また、使い方によっては、使う前に、いちいち、初期化処理を行う必要がある場合も出るでしょう。
 
Publicにすれば特別であるから、その数は少なくて済みますが
お考えの様に、すべからく全ての変数を Public にしたとき、
それらについて、どんな型の変数で、どんな値を持たせているのか 覚えておく必要があります。
 
開発時にはフローを覚えていて、理解できても、
メンテナンス時に、複数のプロシージャに渡って、変数が使われている場合
   それらを確認しないとメンテナンスが行えませんよね。
 
Publicにすると、すべてのプロシージャに対し、代入を行っている処理を探す必要があります。
 
ByVal 引数付きのプロシージャなら、
そのプロシージャ内で その引数自体を参照はしても、書き換える事はできませんから
【書き換えを行っている箇所を探す】行為から見たらプロシージャ宣言部で判断できので楽です。
 
 
実行環境のメモリ量は 昔に比べたら多くなっていますから、メモリ量を気にする必要はないかも知れません
でも、メンテナンスを考えると、賛同しかねます。
 
 
また、引き合いに出されている 引数 ですが、
フォルダ・ファイルの ツリー構造を 取得する際の様に、再帰処理 を行う場合、
Public で 宣言して、同じ様にできるか? というと、できません。
 
再帰呼び出しの考え方
https://www.moug.net/tech/exvba/0150117.html

投稿日時: 24/12/26 14:15:54
投稿者: ffftp

ご回答いただいた3名の先生、ありがとうございました。
 
未熟で雑な質問だったにも関わらず、真摯にお答えいただきありがとうございました。
 
もっと勉強させていただきます。