UserForm-Designer

.. 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: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

UserForm-Designer

#1

Beitrag von d'r Bastler »

Moin allerseits,

ich möchte unter diesem Thema den Code für das dynamische Design von UserForms anbieten. Die wesentlichen Eigenschaften sollen dabei nicht im Projekt-Explorer festgelegt werden, sondern per Wert in einer Tabelle. Das klappt soweit auch bereits sehr gut, bis auf folgende Probleme:

Die neue UserForm soll den Namen "Test" bekommen. Das klappt beim ersten Mal mit folgendem Code:

Code: Alles auswählen

Set usf = ActiveWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)
    With usf
    .Properties("Height") = 180
    .Properties("Width") = 275
    .Name = "Test" 
Auch wenn ich die usf lösche und =Nothing setze, verweigert mir der VBE den Namen erneut zu vergeben. :?:

Vor dem nächsten Testlauf meines Codes möchte ich das vorherige Dingen löschen. Das will mir weder mit Remove noch Delete gelingen. :?:

Als Control in der UserForm habe ich auch ToggleButtons berücksichtigt. Die Eigenschaft Height hole ich mir aus einer Tabellenzelle. Left & Top funktionieren, Width auch, Height aber nicht. :?:

Hat zu den drei :?: jemand eine Idee?

Lieben Dank vorab!!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
Wisi82
Beiträge: 79
Registriert: 14. Apr 2023, 14:22
Hat sich bedankt: 11 Mal
Danksagung erhalten: 25 Mal
Kontaktdaten:

Re: UserForm-Designer

#2

Beitrag von Wisi82 »

Hallo Bastler

zu deinem 3. :?: könnte dies vielleicht helfen:
Man kann es Zufall nennen oder auch Schicksal, aber das Zoomfenster aus dem Beitrag «Zoom per Mausrad» Link zum Tread habe ich komplett dynamisch gestaltet, du müsstest es einfach so anpassen, dass du dir die Werte aus der Tabelle holst, beim Zoomfenster werden die Eigenschaften berechnet.

Bei den anderen beiden habe ich leider keinen Plan.

Beste Grüsse Erwin
Windows 10 Home, Office 2019 Professional, Aber meistens ist es der Kopf, welcher Verwirrung stiftet ;)
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: UserForm-Designer

#3

Beitrag von thowe »

Hallo Heb,

das geht aus der "Architektur" von VBA nicht, da - ja - der gesamte Code eine Interpreter-Sprache ist und in P-Code umgewandelt wird.
Das heißt VBA verarbeitet den Quellcode eines Projekts zur Laufzeit, im Gegensatz zum Compiler (der übersetzt....)


Der einzige für mich bekannte Workaround ist:

UserForm löschen
Arbeitsmappe speichern + schließen
Arbeitsmappe öffnen
UserForm neu generieren.

LG
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: UserForm-Designer

#4

Beitrag von thowe »

Hallo Heb,

zum Thema der Dimensions-Eigenschaften.

Mach es doch mit Enumerationen (Enums). Wie hier schon vorgeschlagen
Das gilt - ja - nicht nur für "ColorSchemes"....

LG
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: UserForm-Designer

#5

Beitrag von d'r Bastler »

Moin Thomas,

auch ohne Deinen theoretischen Hintergrund konnte ich den Effekt Workbook schließen > Userform-Name wiederverwenden auch beobachten und war schon auf dem Weg, die Welt mal zu fragen, ob man diesen Umweg irgendwie simulieren/abkürzen kann.

Inzwischen habe ich einen einfacheren Workaround gebaut, der jeder-Test-Userform einen numerischen Namen zuweist. Public iTest as integer und in der Sub MakeUSF iTest=iTest + 1 und usf.name= "tuf" & iTest klappt ganz gut. Das Prefix tuf steht für testuserform . Nur wenn die MakeUSF an irgendetwas hängen bleibt, produziert VBA wieder eine UserFormX, die dann manuell gelöscht werden will. Und das nervt.

Vor Jahren hatte ich das Thema UserForm nach Prefix löschen schon mal gelöst, kann es aber in meinen Archiven nicht mehr finden. Schade, dass OLP nicht mehr gibt. Dort ist es dokumentiert. Also werde ich daran noch arbeiten müssen.

Deine Liebe zu enums ist mir deutlich bekannt. Ich bevorzuge für diese Konstruktion dann doch auch für nicht VBAstler lesbare Tabellen. Stell Dir vor, ein XL-User kann mit einer einfachen Tabelle und dem MakeUSF blitzschnell seine eigene Userform bauen. Der wird stolz sein wie Bolle :mrgreen:

Schönen Abend noch
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: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: UserForm-Designer

#6

Beitrag von d'r Bastler »

... und ich bin stolz wie Bolle, dass ich endlich eine Aufräum-Routine gefunden habe. Fehlerhafte USF werden folgendermaßen gekillt:

Code: Alles auswählen

Sub DeleteForms()
Dim VBComps As VBComponents
Dim VBComp As VBComponent

Set VBComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In VBComps
    If Left(VBComp.Name, 4) = "User" Or Left(VBComp.Name, 3) = "tuf" Then
        Set VBComp = VBComps(VBComp.Name)
        VBComps.Remove VBComp
    End If
Next

End Sub
Damit werden fehlerfrei und fehlerhaft generierte USFs beseitigt. Anderen USFs, die z.B. mit dem Prefix usf benannt sind, passiert nichts.

Viel Spaß damit!
d'r Bastler von den VBAsteleien.de
Win 10 + Office 2019 & Win11 + Office 2021 + Visio 2019 pro & macOS.X15 + Office2019pro & Android12 & XL365
Benutzeravatar
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: UserForm-Designer

#7

Beitrag von thowe »

Guten Morgen Heb
Deine Liebe zu enums ist mir deutlich bekannt. Ich bevorzuge für diese Konstruktion dann doch auch für nicht VBAstler lesbare Tabellen. Stell Dir vor, ein XL-User kann mit einer einfachen Tabelle und dem MakeUSF blitzschnell seine eigene Userform bauen. Der wird stolz sein wie Bolle
... stell dir vor:
- der VBAstler muss nicht mal die IDE öffnen, weil er es bequem in userform.txt ändert....., oder
- der VBastler kann sich aussuchen: usfDimension.Height = L oder usfDimension.Width = M (weil Enum's)

LG
Benutzeravatar
d'r Bastler
Beiträge: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: UserForm-Designer

#8

Beitrag von d'r Bastler »

Moin,
und hier ist das gestern angekündigte Gevbastel: Eine Userfrom, die mit hart-codierten und Tabellenwerten zusammengeschustert ist. Der Code ist (hoffentlich) verständlich genug, dass man daraus seine eigenen Konstrukte bauen kann.

So sieht's aus:
UserForm.jpg
UserForm.jpg (30.5 KiB) 10096 mal betrachtet
Und das braucht man als Code dazu:
TabelleSystem.zip
(373 Bytes) Noch nie heruntergeladen
modControls.zip
(5.37 KiB) Noch nie heruntergeladen
Die TabelleSystem muss mit der Extension .cls , die modControls mit .bas umbenannt werden. Und dann natürlich noch im VBE importiert ...

Viel Spaß damit!
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: 683
Registriert: 29. Aug 2022, 13:20
Hat sich bedankt: 177 Mal
Danksagung erhalten: 91 Mal

Re: UserForm-Designer

#9

Beitrag von d'r Bastler »

Moin allerseits,

oben habe ich vorgestellt, wie man Test-USF aus einem VBAprojekt beseitigen kann. Hier eine Methode, statt sie gleich zu beseitigen erst einmal in den VBE zu holen bzw. einfach mal zu öffnen. Für den zweiten Schritt verwende ich das allseits unbeliebte SendKeys, was ich aber hier nicht als Problem sehe, weil das Makro so schnell abläuft, dass da keiner dazwischenfunken kann:

Code: Alles auswählen

Sub ShowForms()
Dim VBComps As VBComponents, VBComp As VBComponent

Set VBComps = ThisWorkbook.VBProject.VBComponents
For Each VBComp In VBComps
    If Left(VBComp.Name, 4) = "User" Or Left(VBComp.Name, 3) = "tuf" Then
        Set VBComp = VBComps(VBComp.Name)
        app.VBE.MainWindow.Visible = True 'falls der Editor noch schläft
        VBComp.Activate
        app.SendKeys "{F5}"	'wer nur an der USF arbeiten will, kommentiert diese Zeile aus
        Exit Sub
    End If
Next
End Sub
Ich freue mich dennoch auf Vorschläge zum Umgehen von SendKeys. Viel Spaß damit!

Schönen Abend noch!
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
thowe
Beiträge: 209
Registriert: 12. Sep 2022, 16:57
Hat sich bedankt: 79 Mal
Danksagung erhalten: 67 Mal
Kontaktdaten:

Re: UserForm-Designer

#10

Beitrag von thowe »

Hallo Heb!

ich verstehe es nicht,

Was möchtest du mit "F3"? -> erreichen?

Du kennst mit - mittlerweile - Der Code hat die Majorität ("er steuert"). Nicht der Nutzer. Der wendet an.

Deswegen unabhängig von diesme Topic Always UserForm_Activate()

lg
Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast