kennt Ihr den? Wie bekommt man einen Elefant in den Kühlschrank ...?
So komme ich seit Stunden mit einem Problem vor, das doch irgendwie lösbar sein muss! Der folgende Code baut aus einem Modul heraus eine kleine Userform mit CommandButtons, TextBoxen und einem Frame. Soweit so gut. Nun hätte ich gerne noch ein paar Controls innerhalb des Frames - und genau das will mir nicht gelingen. Meine Recherche hat mich zu Lösungen geführt, die das Thema nach der Erstellung der UserForm realisieren, u.A. mit WithEvents. Es soll aber alles in einem Rutsch aus dem einen Modul laufen. z.B. CodePanes pro Control klappt schon.
Hat jemand eine zündende Idee?
Code: Alles auswählen
Option Explicit
Public iTest As Integer
Sub MakeUserForm()
Dim usf As VBComponent
Dim tbx As MSForms.TextBox, frm As MSForms.Frame, cmd As MSForms.CommandButton
Dim i As Integer, t As Integer
iTest = iTest + 1
'erst einmal aufräumen!! Alle usf mit Prefix User und Test müssen gehen
DeleteForms
'### Für die USFs, TBXn & CMDs kommen die Eigenschaften aus dem Code hier
'#########################################################################
'UserForm
Set usf = ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
With usf
.Properties("Height") = 250
.Properties("Width") = 275
On Error Resume Next
.Name = "Test " & iTest
.Properties("Caption") = "Moin! " & .Name
End With
With usf.CodeModule
.InsertLines 2, "Private WithEvents FRMcmd As MSForms.CommandButton"
.InsertLines 3, "Private WithEvents FRMlbl As MSForms.Label"
End With
'CommandButton(s) >>> hier wird vertikal wiederholt
t = 12
For i = 1 To 5
Set cmd = usf.Designer.Controls.Add("Forms.CommandButton.1")
With cmd
.Name = "cmd" & i
.Caption = .Name
.Height = 18
.Width = 50
.Left = 20
.Top = t
.ControlTipText = .Name
.TabStop = True
.TabIndex = i - 1
End With
t = t + 24
Set cmd = Nothing
Next i
'TextBox(en)
t = 12
For i = 1 To 5
Set tbx = usf.Designer.Controls.Add("Forms.TextBox.1")
With tbx
.Name = "tbx" & i
.Text = .Name
.Height = 18
.Width = 50
.Left = 80
.Top = t
.ControlTipText = .Name
.TabStop = True
.TabIndex = i - 1 + 5 'weil oben gibt's ja schon die CMDs
End With
t = t + 24
Set tbx = Nothing
Next i
'Frame aus dem Code
Set frm = usf.Designer.Controls.Add("Forms.Frame.1")
With frm
.Top = 140
.Left = 10
.Width = 240
.Height = 60
End With
Set cmd = frm.Designer.Controls.Add("Forms.CommandButton.1")
With cmd
.Top = 10
.Left 10
.Width = 100
.Height = 20
End With
Set frm = Nothing
Set cmd = Nothing
'### Für die anderen CTRs kommen die Eigenschaften aus der Tabelle
'##################################################################
'OptionButton, ComboBox, ToggleButton, CheckBox, Label, ...
Set usf = Nothing
End Sub
Sub DeleteForms()
Dim vbComps As VBComponents, vbComp As VBComponent
Set vbComps = ThisWorkbook.VBProject.VBComponents
For Each vbComp In vbComps
Debug.Print vbComp.Name
If Left(vbComp.Name, 4) = "User" Or Left(vbComp.Name, 4) = "Test" Then
Set vbComp = vbComps(vbComp.Name)
vbComps.Remove vbComp
End If
Next
End Sub
Ach ja: Kühlschrank auf - Elefant rein. Und eine Giraffe? Nee - nicht ganz so einfach: Kühlschrak auf, Elefant raus, dann Giraffe rein... Als ich fünf war, fand ich den gut...
Grüße und Dank!!