2016-08-26 1 views
0

Ich arbeite in Excel 2013 und entwerfe ein Benutzerformular mit Steuerelementen, die zur Laufzeit erstellt werden. Ich habe Probleme, eine Funktion zu erstellen, die auf das Änderungsereignis der dynamisch erstellten Steuerelemente ausgelöst wird.VBA Excel Benutzerformular EventHandler für dynamisch generierte Steuerelemente, die nicht wie erwartet funktionieren

Die Steuerelemente sind in einem separaten Klassenmodul enthalten, das sie erstellt und verwaltet. Ich möchte eine Funktion hinzuzufügen, die auf die Veränderung bei einem Combo-Box feuert, so habe ich es Withevents deklariert:

Private WithEvents myComboBox As MSForms.ComboBox 
... other controls and variable declarations... 

Ich habe eine Funktion, die den Rahmen geführt wird, dass ich die Kontrollen in so sein wollen dass ich alle Komponenten innerhalb der Klasse erstellen kann.

Sub initialize(myID As String, myFrame As MSForms.Frame, Left As Double, Top As Double) 
    ... 
    Set myComboBox = myFrame.Controls.Add("Forms.ComboBox.1", myID & "_comboBox") 
    ... 
End Sub 

Dies alles funktioniert, und die ComboBox erstellt und Eigenschaften verändert, obwohl myComboBox erfolgreich ändern, wie die ComboBox angezeigt wird.

Da myComboBoxWithEvents deklariert ist, kann ich myComboBox_Change als Option in den Dropdown-Menüs finden und es in dem Modul setzen:

Private Sub myComboBox_Change() 
    MsgBox ("Change Event Fired") 
End Sub 

Aber diese Funktion wird nicht ausgeführt, und ich kann nicht verstehen Warum? Eine Nachricht wird nicht angezeigt, wenn eine Änderung vorgenommen wird, und der in diese Funktion eingefügte Haltepunkt verhindert die Ausführung von Code nicht. Was mache ich falsch?

+0

Ich kann es nicht selbst überprüfen, aber sicher daran erinnern, aber ... versuchen Sie "Public WithEvents myComboBox als MSForms .ComboBox "statt" Private ... " – user3598756

+0

Vielen Dank für den Vorschlag, aber es hat keinen Unterschied gemacht. – SudoNim

+0

Haben Sie mehr * als einen *? Was ist der Zweck, den Namen dynamisch als 'myID & '_comboBox''? – Comintern

Antwort

2

Mit Hilfe einiger Sondierungsfragen von Cyboashu habe ich herausgefunden, was falsch war. Die Klasse myComboBox wurde nicht von einer Variablen gehalten, die für den Geltungsbereich des gesamten Benutzerformulars deklariert wurde. Nach der Erstellung der Funktion waren die Komponenten noch in myFrame, aber die auf Ereignisse zu löschenden Funktionen waren vergessen.

+0

würde es mit Private WithEvents myComboBox als MSForms.ComboBox funktionieren? – user3598756

+0

Ja, sobald die Klasse im richtigen Umfang deklariert wurde, war es egal, ob die Komponente öffentlich oder privat war. Beide Möglichkeiten haben funktioniert. – SudoNim

+0

danke für die Informationen – user3598756

Verwandte Themen