2016-03-18 58 views
1

我想編寫代碼來處理我的用戶窗體上任何組合框的「更改」事件。VBA代碼在執行時的行爲不同

我經過this問題的答案,並創建一個單獨的類,等等

但是,這是行不通的。在一個新項目中使用相同的代碼可以正常工作,這個代碼在這個項目上有時會用到,當我使用「逐步執行」執行(F8)時,但是當使用正常運行時它不會。

看着其他人的類似困境,我添加了「DoEvents」,但沒有幫助。

這是我在窗體

Private Sub UserForm_Initialize() 

Dim ComboBox_Collection As Collection 
Dim ctrl As Control 
Dim cbc As ComboBox_Class 

Set ComboBox_Collection = New Collection 
    For Each ctrl In UserForm1.MultiPage.Pages(2).Controls 
    DoEvents 
     If TypeName(ctrl) = "ComboBox" Then 
      DoEvents 
      Set cbc = New ComboBox_Class 
      Set cbc.Control = ctrl 
      ComboBox_Collection.Add cbc 
      DoEvents 
     End If 
    Next ctrl 
Set cbc = Nothing 

End Sub 

和類模塊代碼,一個名爲「ComboBox_Class」:

Private WithEvents TriggerComboBox As MSForms.ComboBox 

Public Property Set Control(CB As MSForms.ComboBox) 
    Set TriggerComboBox = CB 
End Property 

Private Sub TriggerComboBox_Change() 
    MsgBox ("yay") 
End Sub 
+0

您能告訴我們您希望發生什麼嗎? –

+0

@ScottMarcus,我想要一個簡單的代碼來處理用戶窗體上給定類型的所有控件的「更改」事件。 – mathgenius

回答

2

ComboBox_Collection需求是一個全局變量(至少,全球到表單中的代碼模塊),或者只要您的UserForm_Initialize小組完成執行,它就會消失/退出示波器

+0

謝謝!就是這樣,我把這個系列移到了模塊上,並將其公開化了,現在它起作用了! – mathgenius

+0

@mathgenius除非需要從課堂外訪問它,否則不需要將其設置爲「Public」。即使你需要在類之外訪問它,你也應該將它的一個副本*(可能是一個數組)作爲「Public Property Get」成員公開,以保持適當的封裝。 –