|
こんにちは。
VBAをどこまで信用するかという事のにも関わってきますが。
Help等を見る限り、オブジェクトを参照している変数がなくなれば
オブジェクトに費やしたメモリ・リソースは開放されるとあります。
例えば、クラスモジュールClass1に
'=====================
Const mcnt = 20000
Dim myarray(1 To mcnt)
'=============================
Private Sub Class_Initialize()
For i = 1 To mcnt
myarray(i) = i
Next
End Sub
'=============================
Private Sub Class_Terminate()
Erase myarray()
Debug.Print "erase"
End Sub
標準モジュールに
'===============================================
Dim mycls1 As Class1
Dim mycls2 As Class1
Dim mycls3 As Class1
'================================================
Sub test()
Set myclass1 = New Class1
Set myclass2 = myclass1
Set myclass3 = myclass1
Set myclass1 = Nothing
Debug.Print "1"
Set myclass2 = Nothing
Debug.Print "2"
Set myclass3 = Nothing
End Sub
このtestを実行すれば、イミディエイトには、
"erase"は一度だけ表示されていますよね?
(myclass3にNothingがセットされたときです)
このときにClass1というオブジェクトも開放されたと考えると・・・。
クラス'Cont_Collで
>'Cont_Collが終了するときにColl_Eventで定義したm_Itemを全て開放したい
>'ここが自信ありません。
>Private Sub Class_Terminate()
>Dim i As Integer
> For i = 1 To m_Coll.Count
m_item(i),id=i
> Set m_Item(i) = Nothing
Next i
End Sub
等としておいて、
クラスColl_Eventでは、
>クラスモジュール"Coll_Event"
>'----------
>'Class名 Coll_Event
>'Collction Eventの意
>Private WithEvents Cont_obj As MSForms.CommandButton
public id as long
>Public Property Let ContItem(ByVal NewCont As MSForms.CommandButton)
> Set Cont_obj = NewCont
>End Property
>'ここからEvent処理を書く
>Private Sub Cont_obj_Click()
> MsgBox "クラスモジュールのイベント" & vbCr & Cont_obj.Caption
>End Sub
Private Sub Class_Terminate()
Debug.Print id
End Sub
などとしておいて正しくTerminateイベントが発生しているか確認してみる
という方法です。
コレクション以外で参照している変数があるとTerminateイベントは
発生しないでしょう?
検討してみてください。
|
|