モジュールレベル変数(コロ子勘違いしていた)
こんにちは。
派犬事務員のコロ子です。
前回記事で自動採番のマクロを作成。
データの保持が上手くできず、空いているセルに仮置きする方法で作成した。
何かもっと良い方法はないのかなぁ~と聞いてみたところ、空腹おやじ(id:Z1000S)さんからこんな方法が!!↓ (素晴らしいので必見)
コードを見て「えっつ!」と。コロ子が空いているセルに仮置きしたデータをモジュールレベル変数に入れている。???と思い実際やってみたところ、コロ子ずっと勘違いしてた事が判明。(注)低レベルです。
モジュールレベル変数
何を勘違いしていたかというと、一つのプロシージャが終了したら「全ての変数が破棄される」と思っていた。
【モジュールレベル変数】
変数をモジュールの最上部で、どこのプロシージャにも属さないで宣言すると、プロシージャ間で共有して使用できる。
Private buf As Long ’**************************************** Sub test1() End Sub ’**************************************** Sub test2() End Sub
この場合だと、変数「buf」はプロシージャ「test1」と「test2」で共有して使用できる。
ここまでは、コロ子も認識していた。
【コロ子の勘違い】
Private buf As Long ’**************************************** Sub test1() buf = 1 End Sub ’**************************************** Sub test2() Debug.Print buf End Sub
上記の場合で
①「test1」を実行する
②「test2」を実行する
一つのプロシージャが終了したら「全ての変数が破棄される」と思っていたので、この場合「test2」の「buf」には「初期値の0」が入っていると思っていた。
実際は値は保持されていて
「test2」の「buf」には「1」が入っている。
えーーーー!そうなの?
コロ子ずーっと勘違いしてた。
そうとは知らず、今までかなりムダに苦戦してきた。
これができるとなるとコードの書き方の考え方が変わる。
目から鱗!!
ちなみに、今までどうやってモジュールレベル変数を使っていたかというと
Private buf1 As Long Private buf2 As Long ’**************************************** Sub test1() buf1 = 1 buf2 = 2 Call test2 End Sub ’**************************************** Sub test2() buf1 = 10 Call test3 End Sub ’**************************************** Sub test3() Debug.Print buf1 Debug.Print buf2 End Sub
引数を渡すのが面倒なとき。
「test2」で「buf2」は必要ないけど、「test2」で呼び出してる「test3」では「buf1」も「buf2」も必要なとき。
引数がたくさんあって、受け渡しがごちゃごちゃのときに使う物だと思っていた。
もしかしたらこの考え方も違うのかも・・・。
今回、空腹おやじさんに教えてもらわなかったら、この先もずーーーっと勘違いしたままだった。本当に、本当に感謝です。
ありがとうございました。