Excel (VBA)

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

 
(指定なし : 指定なし)
オブジェクト変数の破棄
投稿日時: 21/06/12 22:50:42
投稿者: A太郎

オブジェクト変数はプロシージャの最後に set X = Nothing と記して明示的にデータを破棄していることが多いようですが、なぜ一般の変数は破棄しないのでしょうか?
 
説明には、「メモリ上にデータが残らないようにするため」とあり、
この理由ならば一般の変数も同じだと思うのですが・・・。

回答
投稿日時: 21/06/13 07:57:46
投稿者: simple

既にご存じかも知れませんが、
「Set a = Nothing」のお話」
https://www.moug.net/tech/exvba/0150027.html
が参考になるでしょう。

引用:
変数には有効期間があり、有効期間が終了すると、オブジェクトへの参照が正常に解除される仕組みがあります。プロシージャレベル変数の場合、そのタイミングは「End Sub」です。
よく「End Sub」の直前に、プロシージャ内で使用したすべてのオブジェクト変数をまとめて解除する例が見られますが、オブジェクトの使用が終わってすぐにプロシージャも終了するなら、そこで自動的に解除されるので、「Set a = Nothing」 は必ずしも必要ないでしょう。

ただし、Set a = Nothingが必要かどうかについては、別の意見を持つ方もいます。
宣言したら開放するのが礼儀?だから書くようにせよ、という説もあるようです。
 
私は、IE とか DBまわりのオブジェクトについて実行することはありますが、
基本的には書くことはありません。RangeオブジェクトとかWorksheetとかも基本的にしません。
機械が自動的にやってくれることを、人間が手作業で行うことは必要ないと思っています。
 
また、オブジェクトではない変数についても基本的には不要と考えていますが、
大きな配列変数を使用している場合で、用済みであれば、処理の途中でEraseし、
メモリーを開放することで、後続の処理に好影響が考えることを期待することがあります。
かなり限定的です。

回答
投稿日時: 21/06/13 17:02:06
投稿者: 半平太

>オブジェクト変数はプロシージャの最後に set X = Nothing 
>と記して明示的にデータを破棄していることが多いようですが、
>なぜ一般の変数は破棄しないのでしょうか?
 
プロシージャレベルの変数の話ですよね。
 
私の見方は逆ですね。
オブジェクト変数は、終了直前でわざわざNothingをセットするのは何故なのか?
そんなの不要であることは、変数の有効期間から明らかである。
 
しかし、なぜかこの問題については昔から議論が分かれています。
 
推測に過ぎませんが(・・と言うか、真相は誰も知らない)、
昔、ADOオブジェクトがらみでエラーが頻発し、
Nothingをセットしたら「何故か不思議に」収まった。
 
それ以来、そんな情報が広がり、更にADO以外にもこの種のバグが
あるかも知れないとして(この懸念には一理ある)、
ADOに関係ないものまで対象を広げた。
 
つまり、ADOがらみの限定的処置(バグ対策)であったものが、
一般的作法(仕様レベルの処置)まがいに化けた。
 
昔、この問題を調査している時、下のブログに突き当たりました。
【When Are You Required To Set Objects To Nothing?】
https://docs.microsoft.com/en-us/archive/blogs/ericlippert/when-are-you-required-to-set-objects-to-nothing
それによると、「まともなプログラマーなら、おまじないなんて書くべきではない」
そうマイクロソフトのテクニシャンが言っていると読みましたが。。

投稿日時: 21/06/26 10:49:02
投稿者: A太郎

皆様
解説回答ありがとうございます!
また返信が遅れたこと申し訳ありませんでした。
 
set a = nothing 
は一般にも意見の分かれているところなんですね。
nothingをすることで、変数との関係性を立ち切る(以降使えなくなる)という説明がしっくりきました。
初学者の私には、まだ理解が及ばないところが多々ありますが、今後ともよろしくお願いします。