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
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
Viel Spaß!
Lg thowe