UserForm-Designer 2nLevel

.. 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
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

UserForm-Designer 2nLevel

#1

Beitrag von d'r Bastler »

Moin allerseits,

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
Test empfehle ich in einer leeren Mappe: DeleteForms killt alle Standard-Userforms.

Ach ja: Kühlschrank auf - Elefant rein. Und eine Giraffe? Nee - nicht ganz so einfach: Kühlschrak auf, Elefant raus, dann Giraffe rein... :mrgreen: Als ich fünf war, fand ich den gut...

Grüße und Dank!!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

GELÖST: UserForm-Designer 2nLevel

#2

Beitrag von d'r Bastler »

Moin allerseits,

es war ein kleines Detail in meinem Code, das nicht passte. So geht's:

Code: Alles auswählen

Set cmd = usf.Designer.Controls(frm.Name).Controls.Add("Forms.CommandButton.1")
Grüße
Folgende Benutzer bedankten sich beim Autor d'r Bastler für den Beitrag:
thowe
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
d'r Bastler
Beiträge: 670
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 175 Mal
Danksagung erhalten: 90 Mal

Re: UserForm-Designer 2nLevel

#3

Beitrag von d'r Bastler »

Und nun noch das Sahnehäubchen: Eine ListView in der Userform. Voraussetzung ist der Verweis auf Microsoft Windows Common Controls 6.0 (SP6), zu finden im VBE unter Extras > Verweise. Dann im bereits bestehenden Modul die folgenden Ergänzungen:

Code: Alles auswählen

Dim lvw As MSComctlLib.ListView, li As ListItem

Set lvw = usf.Designer.Controls.Add("MSComCtlLib.ListViewCtrl.2") ', Link:=False, DisplayAsIcon:=False, Left:=10, Top:=220, Width:=240, Height:=60)
'die folgenden Parameter müssen natürlich bedarfsgerecht angepasst werden.
With lvw
        .Top = 220
        .Left = 10
        .Width = 240
        .Height = 90
        .LabelEdit = lvwAutomatic
        .View = lvwReport
        .CheckBoxes = True
        .FullRowSelect = True
        .Gridlines = True
    With .ColumnHeaders
        .Clear
        .Add , , "Item", 70
        .Add , , "Subitem-1", 70
        .Add , , "Subitem-2", 70
    End With

    Set li = .ListItems.Add()
        li.ListSubItems.Add , , "Subitem 1.1"
        li.ListSubItems.Add , , "Subitem 1.2"

    Set li = .ListItems.Add()
        li.ListSubItems.Add , , "Subitem 2.1"
        li.ListSubItems.Add , , "Subitem 2.2"

    Set li = .ListItems.Add()
        li.ListSubItems.Add , , "Subitem 3.1"
        li.ListSubItems.Add , , "Subitem 3.2"

    .ColumnHeaders(1).Position = 2
End With
Und dann kann so etwas z.B. so aussehen. Ganz ohne Schubsereien und Anpassungen im VBE, ohne Werkzeugsammlung ...
DynUSF.jpg
DynUSF.jpg (44.32 KiB) 6152 mal betrachtet
Viel Spaß damit!

p.s. den Tippfehler in der Caption der USF dürft Ihr natürlich behalten ;)
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Antworten

Wer ist online?

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