2017-02-01 5 views
1

私はこの質問に固有の答えを見つけられませんでしたので、誰かが私のためにそれをクリアすることができれば幸いです。変数が新しいオブジェクトに設定されていると、VBAオブジェクトは破棄されますか?

私はVBAのガベージコレクタは、オブジェクトが使用する(それによって、参照カウントをデクリメント)長くない必要とされ、明示的変数の関連付けを解除するかどうかを判断するために参照カウントを使用して理解して:ここで

Set objectVariable = Nothing 

は何ですか私は今、私が働いているスプレッドシートを持っている:

Declare Function GetObject Lib "ObjectCreator.dll"() As Object 
Public MyObject as Object 

Sub MyMethod() 
    Set MyObject = GetObject() 
     ...do stuff with MyObject... 

    Set MyObject = GetObject() 
     ...do stuff with my new MyObject... 

    Set MyObject = GetObject() 
     ...do stuff with my even newer MyObject... 

    Set MyObject = Nothing 
End Sub 

私の質問は:作成したオブジェクトのすべての3つは、GCまたは最後のものだけで破壊されたのですか?すなわち、参照変数がNothingに設定されているのではなく、別のオブジェクトに設定されている場合、オブジェクトの参照カウントが減少するか?

+1

'GetObject'メソッドを持っているdllを本当に持っているなら、VBA' GetObject'関数を隠さないようにdeclareステートメントで別名を付けるべきです。 – Comintern

+0

@Comintern:別の名前を使用しているはずです...いいえ、DLLにはGetObjectメソッドがありません。オブジェクトを返すメソッドです。私はその例を単純にするためにその名前を使用しました。 – zaphodalive

答えて

2

オブジェクト参照を変数に割り当てると、参照カウントが1増加し、変数が他の割り当てによって参照を失うと、オブジェクトの参照カウントが1つ下がります。例:

Dim a As Collection 
Set a = new Collection 'The reference count of this new Collection object is 1 
Set b = a    'The reference count of the Collection object is now 2 
Set b = new Collection 'The reference count of the original collection has gone back down to 1 because b is no longer a reference to it, and this new Collection has a reference count of 1 

Set a = Nothing  'The original collection no longer has any active references, so VBA safely GCs it. 
Set b = Nothing  'The newer collection now no longer has any active references either, so VBA safely GCs it. 

ここでは、自分のメモリまたは実行状態を内部的に異なる方法で管理する外部DLLについて説明します。しかし、VBAがCOM参照カウントを処理する方法は同じです。

+0

ありがとう、それは私が知る必要があったすべてです。私は、作業中のスプレッドシートが、変数参照を '= Nothing'で明示的に壊さずに、インスタンス化されていない無限のオブジェクトを作成しないようにしたいと考えました。 – zaphodalive

+0

FWIW、*すべて* COMオブジェクトは参照カウントをそのように処理し、ユーザーオブジェクトはCOMオブジェクトです。 IIRこれらは、VBE7.dllの隠された2番目のtypelibで定義された基本クラスを拡張します。 VBAはCOM参照カウントインターフェイスを使用し、COMサーバーがオブジェクトの寿命を判断できるようにします。 – Comintern

関連する問題