2015-09-04 24 views
2

我有下面的代碼模塊的工作簿:如何覆蓋正在寫的控件的control_Change事件?

類模塊:clsComboBox


Option Explicit 

Private WithEvents MyComboBox As MSForms.ComboBox 

Public Property Set cmboControl(cmboBox As MSForms.ComboBox) 
    Set MyComboBox = cmboBox 
End Property 

Private Sub MyComboBox_Change() 
    If MyComboBox.Value = "2" Then 
     MsgBox "I will be so happy if this ever runs" 
    End If 
End Sub 

用戶窗體:UserForm1(包含單個按鈕,CommandButton1的)


Option Explicit 

Private Sub CommandButton1_Click() 

    Dim ctlcombobox As ComboBox 
    Dim clsobject As clsComboBox 

    Set ctlcombobox = Me.Controls.Add("Forms.ComboBox.1", "ComboBox1", True) 
    Set clsobject = New clsComboBox 
    Set clsobject.cmboControl = ctlcombobox 
    With ctlcombobox 
     .Top = 100 
     .Left = 5 
     .Width = 200 
     .Height = 25 
     .Visible = True 
     .List = Array("1", "2") 
    End With 
End Sub 

我想用我在飛行中創建的每個新組合框覆蓋combobox_change事件。但是,代碼不起作用。當在組合框上選擇「2」時,沒有任何反應。我究竟做錯了什麼?

例如工作簿:

https://www.dropbox.com/s/ctr51lote86fbox/test%20combo%20box.xlsm?dl=0

編輯

謝謝,蒂姆的答案。我不得不創建一個可變長度的數組來容納我在內存中動態創建的所有組合框。 (原來的問題是關於單個組合框,但在我的實際工作表中,我在運行時創建了一個未知數)。

回答

2
Dim clsobject As clsComboBox 

這需要一個全局變量:在當前的代碼它儘快CommandButton1_Click出口超出範圍。如果你想捕捉後來的事件,它需要堅持下去。

+0

我敢肯定,這將解決我的窗體,我會讓你知道在週二,當我回去工作(唐在家用電腦上沒有辦公室)。順便說一句,如果我創建了一個類型爲userform的可變長度數組,這是否可以讓我處理多個用戶表單,這些用戶表單是我創建的? –

1

正是蒂姆說 - 正義之舉的是一行代碼:

Option Explicit 
Dim clsobject As clsComboBox 

Private Sub CommandButton1_Click() 

    Dim ctlcombobox As ComboBox 

    Set ctlcombobox = Me.Controls.Add("Forms.ComboBox.1", "ComboBox1", True) 
    Set clsobject = New clsComboBox 
    Set clsobject.cmboControl = ctlcombobox 
    With ctlcombobox 
     .Top = 100 
     .Left = 5 
     .Width = 200 
     .Height = 25 
     .Visible = True 
     .List = Array("1", "2") 
    End With 
End Sub