プロが教えるわが家の防犯対策術!

VBAの素人です。
グローバル変数ってどのようなことをしたら解放されますか?
ネット上で、すぐグローバル変数が解放されたとかよく聞くし、end sub を通ったら解放されるというのもあれば、end sub を通っても、解放されないって聞きます。どっちが正しいのでしょうか。又どのようなことをしたら解放されるのでしょうか?

教えて!goo グレード

A 回答 (2件)

こんばんは


VBAの場合、たしか、グローバル変数はExcelを閉じるまで解放されないと思いました。
解放がどのような意味なのか少し分からないのですが、
オブジェクト型なら Nothingを代入すればNothingとなりますが
代入しなければ、変数に代入されたオブジェクトは維持されます。
Module1に
Option Explicit
Public buf As Range
Sub test1()
Set buf = Range("A1")
End Sub

Module2に
Option Explicit
Sub test2()
MsgBox buf.Value
Set buf = Nothing
End Sub

test1を実行後 test2を実行
A1セルの値が表示される

続けてもう一度test2を実行すると
91エラー
これは Set buf = Nothing で オブジェクトがNothingになった為
(これを解放と言う場合は解放されたことになります)

Set buf = Nothingを削除またはコメントアウトして
test1を実行後 test2を実行
A1セルの値が表示される
続けてもう一度test2を実行すると
A1セルの値が表示される
つまり、End Subでは buf = Nothingと成らないです

これがプロシージャレベルですとEnd Subでbufの値は消えます
モジュールレベルですと他のモジュールからは使えませんが
End Subでは消えず、オブジェクト型の場合、set buf = Nothingで代入するか閉じるまで、対象のモジュールでは維持されます。

解放と言うキーワードでオブジェクト型としましたが、Public変数は宣言でメモリ確保(予約)されているように思います。
メモリ解放すると言うイメージの場合、プロシージャレベルで宣言する必要があるのでは無いかと思います。

私的なまとめ
宣言セクションで変数宣言すると閉じるまでメモリ確保(予約)されている
プロシージャ内で変数宣言すると実行時のみメモリ確保されEnd Subで解放される。

間違いがあるかも知れませんが、独学趣味レベルの認識です。
違ってたら教えてくださいお願いします。
    • good
    • 2
この回答へのお礼

回答ありがとうございます。つまり、Excelが勝手に、publicに格納されたデータを解放するわけではないのですね。

お礼日時:2022/01/12 23:24

モジュール内のグローバル変数は、Excelのブックが閉じられないと解放されません。


値を初期化したいなどがあるなら自力で行う必要があります。

クラスやフォーム内のインスタンス変数は、インスタンスを破棄した時点で解放されます。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

教えて!goo グレード

このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング