2016-03-18 16 views
1

Ich versuche, Code zu schreiben, der das Ereignis "ändern" von einer ComboBox auf meinem Benutzerformular behandelt.VBA-Code verhält sich anders beim Schritt

Ich ging durch this Antwort auf die Frage und erstellt eine eigene Klasse usw.

Aber es funktioniert nicht. Die Verwendung desselben Codes in einem neuen Projekt funktioniert gut, dieser Code in diesem Projekt funktioniert manchmal, wenn ich die "Schritt für Schritt" -Ausführung (F8) benutze, aber wenn ich normale Ausführung verwende, funktioniert das nicht.

Mit Blick auf ähnliche Situationen anderer Leute fügte ich "DoEvents" hinzu, aber das half nicht.

Dies ist mein Code in der Userform

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 

Und das Klassenmodul, mit dem Namen "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

Können Sie uns sagen, was Sie gerne geschehen würde? –

+0

@ScottMarcus, ich möchte einen einfachen Code haben, der das Ereignis "change" für alle Steuerelemente eines bestimmten Typs in einem Benutzerformular behandelt. – mathgenius

Antwort

2

ComboBox_Collection Bedürfnisse einer globalen Variablen sein (zumindest Global Ihre Formulars Code-Modul), oder es wird verschwinden/außerhalb des Geltungsbereichs, sobald Ihre UserForm_Initialize Sub ausgeführt wird

+0

Danke! Das war es, ich habe die Sammlung ins Modul verschoben und öffentlich gemacht, jetzt funktioniert es! – mathgenius

+0

@mathgenius Sie müssen es nicht "Öffentlich" machen, es sei denn, Sie müssen von außerhalb der Klasse darauf zugreifen. Und selbst wenn Sie außerhalb der Klasse darauf zugreifen müssen, sollten Sie * eine Kopie davon (möglicherweise ein Array) als 'Public-Property-Get'-Member verfügbar machen, um die korrekte Kapselung zu erhalten. –

Verwandte Themen