2016-08-07 4 views
0

Also versuche ich das _click-Ereignis zu einem dynamisch hinzugefügten Textbox-Steuerelement auf einem Benutzerformular arbeiten.Dynamisch hinzugefügt Benutzerformular Textbox Steuerelement _click Ereignis nicht feuern? (aber _change funktioniert) (VBA)

Hier ist mein Code, es bekommt die _change Ereignisse gut, aber die _click -Ereignis nicht feuern.

' Userform code 
Dim myControlsEventH As Collection 

Private Sub UserForm_Initialize() 
    Set myControlsEventH = New Collection 
End Sub 

Public Sub AddTextbox(myName As String) 

    'Dim MyTextBox As Object 
    Dim myTextbox As MSForms.TextBox 

    Set myTextbox = frmStamps.Controls.Add("Forms.TextBox.1", myName, True) 

    myTextbox.TextAlign = 2 
    myTextbox.Font.Size = 18 
    myTextbox.WordWrap = False 
    'MyTextBox.AutoSize = True 
    AdjustSize 

    Dim txtbxEvent As ctxtbxEventH 
    Set txtbxEvent = New ctxtbxEventH 
    Set txtbxEvent.frm = frmStamps 
    Set txtbxEvent.txtbox = myTextbox 

    myControlsEventH.Add txtbxEvent 

End Sub 

' ctxtbxEventH Class code 
Public WithEvents txtbox As MSForms.TextBox 
Public frm As UserForm 

Private Sub txtbox_Click() 
    Debug.Print "clicked" 
End Sub 

Private Sub txtbox_Change() 
    Debug.Print "changed" 
End Sub 

(BONUS Frage (wo kann ich die Liste aller möglichen Ereignisse für jede der MSForms Kontrollen finden?))

+0

als Seiten Beachten Sie, dass Sie "mit" verwenden sollten. Und ich bevorzuge scripting.dictionary für Klassenereignisse, weil ich überprüfen kann, ob sie existieren und sie leicht entfernen, weil Wörterbücher diese Funktionalitäten haben. (und sind schneller) –

+0

Danke, ich habe nie mit verwendet, ich habe es in vielen Beispielen gesehen, aber ich habe nie untersucht. Was die Verwendung von scripting.dictionary betrifft, habe ich nie davon gehört. Es scheint eine Alternative zu einer Sammlung zu sein? In diesem Fall setze ich das Eventhandler-Objekt dort hinein, damit es am Ende der Ausführung von AddTextbox() nicht verschwindet, aber ich verweise nicht mehr auf sie im Code. – Shodan

+0

für das Wörterbuch, siehe http://excelmacromastery.com/Blog/index.php/vba-dictionary/. zum dynamischen Löschen von Steuerelementen oder zum Überprüfen ihrer Existenz ohne Notwendigkeit eines "Fehler beim nächsten fortsetzen" ist es sehr nützlich. Beachten Sie auch, dass Sie einen Verweis auf MICROSOFT SCRIPTING RUNTIME hinzufügen oder jedes Mal hinzufügen müssen, wenn Sie ObjectVar = CreateObject ("Scripting.Dictionary") festlegen. –

Antwort

4

A MSForms.TextBox hat keine Click Ereignis. Aber ein Ereignis MouseUP ist verfügbar.

Private Sub txtbox_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    Debug.Print "mouse up" 
End Sub 

Sie eine Liste der möglichen Ereignisse haben die Liste in der Deklarations/Verfahren Navigationsbox im VBA-Editor, nachdem stellen Sie das benötigte Objekt im Objekt-Navigationsfeld mit:

enter image description here

+0

Danke, Sie haben beide meine Fragen auf einmal beantwortet! – Shodan

Verwandte Themen