派遣事務員の迷走

派遣事務員コロ子。会社の犬。顔出しNG。常に迷走している。

モジュールレベル変数(コロ子勘違いしていた)

こんにちは。
派犬事務員のコロ子です。

前回記事で自動採番のマクロを作成。
データの保持が上手くできず、空いているセルに仮置きする方法で作成した。
何かもっと良い方法はないのかなぁ~と聞いてみたところ、空腹おやじ(id:Z1000S)さんからこんな方法が!! (素晴らしいので必見)

z1000s.hatenablog.com


コードを見て「えっつ!」と。コロ子が空いているセルに仮置きしたデータをモジュールレベル変数に入れている。???と思い実際やってみたところ、コロ子ずっと勘違いしてた事が判明。(注)低レベルです。

モジュールレベル変数

何を勘違いしていたかというと、一つのプロシージャが終了したら「全ての変数が破棄される」と思っていた。

【モジュールレベル変数】
変数をモジュールの最上部で、どこのプロシージャにも属さないで宣言すると、プロシージャ間で共有して使用できる。

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」も必要なとき。
引数がたくさんあって、受け渡しがごちゃごちゃのときに使う物だと思っていた。
もしかしたらこの考え方も違うのかも・・・。

今回、空腹おやじさんに教えてもらわなかったら、この先もずーーーっと勘違いしたままだった。本当に、本当に感謝です。
ありがとうございました。