Eventhandler für dynamische Controls (TextBox)

.. das wohl mächtigste Werkzeug in Bill Gates' Büro-Sippe. Ob reine Formeln, PowerQuery oder VBA. Hier bleiben kaum Wünsche unerfüllt.
Benutzeravatar
thowe
Beiträge: 196
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 78 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Eventhandler für dynamische Controls (TextBox)

#1

Beitrag von thowe »

Hallo!

Mit dieser VBAstelei liefere ich euch einen denkbaren Lösungsweg, wie man zur Laufzeit (also dynamisch) Controls zu einer vorhandenen, bestehenden UserForm hinzufügen kann.

Hier wird beispielshaft eine Klasse verwendet um neben den "per Default" vorhandenen Eventhandler wie beispielsweise Change() auch eigene (Custom) Eventhandler verfügbar macht.

Der Vorteil der Nutzung einer "instanziierten Klasse" ist, dass man nicht jedesmal den selben Code für gleichwertige Controls in einer UserForm, (zB TextBox) schreiben muss.
Damit löst man elegant, das "Dry-Prinzp (Don`t repeat yourself). Auf weitere Vorteile werdet ihr beim VBAsteln selbst draufkommen....

In dieser beispielhaften Klasse wird einfach nur ein Wert in die Zelle "A1" des - gerade - aktiven Arbeitsblattes geschrieben.

Aus meiner Sicht ist wichtig anzumerken, dass sämtliche Prozeduren, Funktionen das Control betreffend ausschließlich in der Klasse (hier: clsCore_TEXTBOX_EventHandler) definiert/programmiert werden.

Wie könnt ihr diese Übungs-/Beispiel-VBAstelei nutzen?

Ich habe neben der Datei ReadMe.txt auch die einzelnen Module und das notwendige Klassenmodul sowie die Userform als .zip hochgeladen.

Die Codeteile die für den programmatischen Ablauf verwendet werden müssen, habe ich tieferstehend in einem jeweiligen Codeblock eingefügt.

Was macht die VBAstelei?

Wenn ihr in der UserForm (dlgCore_TEST_TextBoxCollection) die UserForm_Initialize() Prozedur startet öffnet sich eine Dialogbox.
In dieser - bitte - nur in die erste TextBox (hat einen grünen Hintergrund) einen Wert eingeben. Dieser wird in die Zelle "A1" des aktiven Arbeitsblattes geschrieben.

Nebenbei habe ich es mir nicht nehmen lassen, ein paar Properties der Controls (TextBoxen) und des Objektes (Userform) via Enumerations (siehe modCore_ENUMS) zu setzen.

Natürlich kann man diesen Code für andere Controls, wie beispielsweise ListBox, CommandButtons, RadioButtons etc. verwenden:

clsCore_TEXTBOX_EventHandler

Code: Alles auswählen

Private WithEvents m_objTextBox As MSForms.TextBox

Public Property Set TextBox(ByVal objTextBox As MSForms.TextBox)
    Set m_objTextBox = objTextBox
End Property

Private Sub Class_Initialize()

End Sub

Private Sub m_objTextBox_Change()
    'do some stuff here
End Sub

Private Sub m_objTextBox_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    'do also some stuff here
End Sub

Public Sub PrintMyValue()
    'Only an example for a custom Event
    'this demonstrates that any procedure can be called
    'to do some stuff with the dynamic created Control (TextBox)
    
    With ActiveSheet
        .Cells(1, 1).Select
        .Cells(1, 1).value = m_objTextBox.Text
    End With
End Sub


dlgCore_TEST_TextBoxCollection

Code: Alles auswählen

Private m_collControls As Collection 'The Collection of all Textboxes in this UserForm
Dim ctlTextbox As MSForms.TextBox
Dim objEventHandler As clsCore_TEXTBOX_EventHandler

Private Sub CommandButton1_Click()
    Hide
End Sub

Private Sub btnOK_Click()

    'This is only a Demonstration ho to use a custom Eventhandler
    'In this example we call the Simple Subroutine PrintMyValue
    'which is in the ClassModule: clsCore_TEXTBOX_EventHandler
    m_collControls.Item(1).PrintMyValue
    Me.Hide
End Sub

Private Sub UserForm_Initialize()

    Dim i As Long 'Iterator
    
    'initialize
    'the .Top Position of first Control (Textbox)
    lngTop = eControlsParams.Top
    'the .Left Position of first (Column) of Control (Textbox)
    'lngLeft = eControlsParams.Left

    Set m_collControls = New Collection
    
    
    'To make this Code easily we iterate only twice (hardcoded)
    'By use in practice yoy may iterate through Cells, Ranges, ADODB.Recordsets....
    'So, lets create the Textboxes (in this Case only 2)
    For i = 1 To 2
        Set ctlTextbox = Me.Controls.Add("Forms.Textbox.1", "ctlTextbox" & i)

        With ctlTextbox
            .Left = eControlsParams.Left
            .Top = lngTop
            .Width = eControlsParams.Width * 8
            .Font.Size = eFontSizes.M
            If i = 1 Then .BackColor = eRGBColors.Green
        End With
        lngTop = lngTop + (eControlsParams.Height + eControlsParams.VerticalSpace)

        'Add to Class and
        'add to Collection
        Set objEventHandler = New clsCore_TEXTBOX_EventHandler
        Set objEventHandler.TextBox = ctlTextbox
        m_collControls.Add objEventHandler
    Next i
    
    'Style this UserForm (dlgCore_TEST_TextBoxCollection)
    With Me
        'the Dark Mode...
        .BackColor = eRGBColors.Black
    End With

End Sub

Private Sub UserForm_Terminate()
    Set m_collControls = Nothing
End Sub
mdlCore_ENUMS

Code: Alles auswählen

Enum eControlsParams
    Height = 24
    HorizontalSpace = 8
    Left = 6
    Top = 6
    VerticalSpace = 8
    Width = 16
End Enum

Enum eFontSizes
    XXL = 26
    XL = 14
    L = 12
    M = 10
    S = 8
    XS = 6
End Enum

Enum eRGBColors
    'note the scheme of colors is BBGGRR and not RRGGBB (=RGB) with hex-values
    Black = &H383330 'Hex(#303338)
    Green = &H34843A 'Hex(#3A8434)
    Red = &H34209E   'Hex(#9E2034)
End Enum
PlayaroundsClassesForUserFormControls.zip
(5.54 KiB) Noch nie heruntergeladen
ReadMe.txt
(2.44 KiB) Noch nie heruntergeladen

Viel Spaß!
Lg thowe
Folgende Benutzer bedankten sich beim Autor thowe für den Beitrag:
d'r Bastler

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste