| 
    
     |  | こんにちは。 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イベントは
 発生しないでしょう?
 
 検討してみてください。
 
 |  |