最近、私はある質問に出くわし、ドキドキしました。それは私を忙しくさせ、ネット上でそれについての明確な説明を見つけることができませんでした.
これは、Excel オブジェクトの破壊に関連しています (これは私が常に使用しており、これまで実際に疑問に思ったことはありません)。
私の質問につながる背景:
通常のオブジェクトでは、キーワード SET および NEW を使用してオブジェクトをインスタンス化できます。例えば:
Set classInstance = New className
この方法でインスタンス化するたびに、オブジェクトがヒープ メモリ内に作成され、参照カウンターが 1 増加します。
これ以上参照を追加しない場合、次のステートメントは参照カウントをゼロに戻します。
Set classInstance = Nothing
参照カウントが 0 になると、オブジェクトは破棄されてメモリからクリアされ、「classInstance」は を指します。
私が読んだこと:
「CREATEOBJECT」関数を使用すると、COM オブジェクトへの参照が返されます。
Set oApp = CreateObject("Excel.Application")
とはいえ、次のように言えます。
Set oApp = nothing
オブジェクトの参照カウントは 0 になり、oApp はオブジェクトをポイントしなくなります。
私の質問:
1) オブジェクトが実際にメモリから削除される前に、このタイプのオブジェクトがメソッド .Quit を呼び出す必要があるのはなぜですか?
.close メソッドを必要とするワークブック オブジェクト (workbooks.add または workbook.open) への参照を追加する場合も同様です。参照カウントをゼロにしたときに、これらのオブジェクトを自動的に破棄できないのはなぜですか?
たとえば、次のように言う場合です。
set oRange = nothing
2) そして、次のことを言う必要がありますか?
oApp.Quit
set oApp = nothing
.Quit を適用すると、Application オブジェクトは既にメモリからクリアされているため、解放されるオブジェクトはもうありません。
私が思いついた唯一の理由は、Quit 後に oApp が Nothing に設定される理由は、(ヒープ上の) 未使用のメモリ位置を指している可能性があり、このメモリが再割り当てされた場合に後で混乱を招く可能性があるためです。 (ただし、VBAではこれを想像するのは難しいと思います)。この結論が正しいかどうか自問自答していたので、答えを知っている人からその確認を受けたい.
これが間違っているかどうか教えてください。
3)VBAで「オブジェクトへの参照」と呼ばれるもの(上記のコードのoAppなど)は、Cのポインター変数と見なされます。このステートメントを使用しても安全でしょうか、それとも間違っていますか?
一般的に適用するのは難しいことではありません。終了して何も設定しませんが、トピックに関する正確な情報を受け取るとよいでしょう。なぜ私がそれをしているのかを100%知るために。