Userform mit Radio-Button per VBA dynamisch erstellen

gehtnetgibtsnet

Cadet 4th Year
Registriert
März 2019
Beiträge
103
Hallo Forum.

Ich hatte eine ähnlich Frage bereits vor über 1 Jahr gestellt. Damals habe ich das Thema nicht mehr weiterverfolgt.
Doch jetzt möchte ich ein ähnliches Problem lösen. Ich möchte den Anwender mit einer Userform, welche mit Radio-Buttons ausgestattet ist, eine der möglichen Antworten auswählen lassen. Allerdings ist die Anzahl der möglichen Antworten dynamisch. Deshalb sehe ich nur die Möglichkeit, auch die zugehörige Userform dynamisch zu erstellen.

Die Größe der Userform ist natürlich abhängig von der Anzahl der möglichen Antworten. Diese Anzahl steht natürlich zum Zeitpunkt der Erstellung der Userform fest. In der Userform sollen dann die verschiedenen Begriffe zeilenweise aufgezählt werden, und jeweils mit einem Radio-Button versehen werden. Der Anwender kann dann nur eine der angezeigten Möglichkeiten wählen, oder die Auswahl abbrechen.

Im Internet habe ich einen Ansatz für eine dynamische Textbox gefunden, doch das bringt mich nicht wirklich weiter. Für Radio-Buttons habe ich kein Beispiel gefunden.

Kann mir jemand weiterhelfen?

Den erwähnten Code habe ich beigefügt. Es gibt allerdings damit das Problem, dass nur beim ersten Durchlauf der vorgegebene Name für die Userform funktioniert. Wenn die Userform manuell gelöscht, die Mappe gesichert, geschlossen und wieder neu geöffnet wird, funktioniert die Vergabe wieder. Der fehlerhafte Befehl kann übersprungen werden, weil der tatsächliche Name ermittelt, und für die Löschung verwendet wird. Vor dem Löschen habe ich einen "Stop" eingebaut, um eingreifen zu können.
Kleiner Hinweis: der Code benötigt einen Verweis auf "Microsoft Forms 2.0 Object Library". Das geht am einfachsten, wenn eine Userform eingefügt und wieder gelöscht wird; der Verweis bleibt dann erhalten.
 

Anhänge

  • dynamische_Textbox.txt
    1,1 KB · Aufrufe: 166
gehtnetgibtsnet schrieb:
Ich möchte den Anwender mit einer Userform, welche mit Radio-Buttons ausgestattet ist, eine der möglichen Antworten auswählen lassen.
Such dir für so etwas Dynamisches wie Umfragen (und damit einzelnen unterschiedlichen Fragen) Dinge wie LimeSurvey. Das kann so was viel besser und du muss nicht das Rad neu erfinden und nachprogrammieren.

Und aus dem Bauch heraus: du kannst dir von einem Radio-Button nichts kaufen wenn nicht auch eine Programmierlogik dahintersteht, der Button »drappiert« wird und seine Schaltfunktion aufgefangen.
Und ausgewertet muss das alles auch noch werden.
Theoretisch - weißt du vorher wie deine Fragen aussehen. Theoretisch legst du für 5 Fragen einfach 5 konfektionierte Ueer-Forms an die der Reihe nach angezeigt werden. Über eine Folgelogik innerhalb der Fragen will ich gar nicht nachdenken.
Der negative Ansatz wäre eine ausreichend groß vordimensionierte User-Form bei der von unten her überzählige Fragen deaktiviert = unsichtbar gemacht sind und die Höhe noch nachgepfelgt wird (bevor am die UserForm anzeigt).

CN8
 
Hallo tRITON.

die ("3" bei "ThisWorkbook.VBProject.VBComponents.Add(3)" ist nicht der Name der Userform, sondern der Typ.

In vielen Beispielen findet sich:

Const vbext_ct_MSForm As Long = 3
ThisWorkbook.VBProject.VBComponents.Add(vbext_ct_MSForm)

die Angabe
.Name = UFName
funktioniert problemlos, wenn die Mappe ohne Userform geöffnet wurde. Ist eine Userform vorhanden, und wird diese gelöscht, und dann der Code ausgeführt, führt dies zu einem Fehler. Deshalb sichere ich mir den tatsächlich vergebenen Namen

FormName = MyUForm.Name

und benutze diese Variable am Ende, um die Userform wieder zu löschen.
Ergänzung ()

Hallo CN8

Die von Dir geschilderten Probleme sehe ich nicht. Und ich habe auch nicht die Absicht, zusätzliche Software zum Einsatz zu bringen. Aber über eines werde ich intensiv nachdenken (nachdem ich das bisher nicht so gesehen habe):

Der negative Ansatz wäre eine ausreichend groß vordimensionierte User-Form bei der von unten her überzählige Fragen deaktiviert = unsichtbar gemacht sind und die Höhe noch nachgepfelgt wird (bevor am die UserForm anzeigt).

Möglicherweise verstehe ich unter einem "Radio-Button" auch das falsche. Ich biete dem Anwender die Wahl zwischen zum Beispiel 3 Begriffen, und er muss sich für einen davon entscheiden. Wenn ein bestimmter Begriff angeklickt wird, wird automatisch jeder andere aufgehoben. So verstehe ich das.
 
Zuletzt bearbeitet:
Schau mal hier rein:

https://stackoverflow.com/questions/57809025/delete-some-vba-forms-and-modules-leave-others

On Error Resume Next sorgt ja dafür das der Fehler unterdrückt wird, wenn die Form nicht gefunden wird.

Das löst aber nicht dein grundlegendes Problem

Hier:

http://www.java2s.com/Code/VBA-Excel-Access-Word/Forms/CreatingUserFormsProgrammatically.htm

Set TempForm = ThisWorkbook.VBProject.VBComponents.Add(3) 'vbext_ct_MSForm

Das ist das entscheidende Element.

Du sicherse dir die Referenz auf das erstelle Objekt.

Dann kannst Du auch später mit

ThisWorkbook.VBProject.VBComponents.Remove TempForm

genau dieses Objekt löschen.

Wie in meinem ersten Post steht "MyUForm" <-> "FormName" = Null Ref Error oder sonst was zur Laufzeit. Sry aber VBA habe ich seit mehr als 15 Jahren nicht mehr gesehen. Bin ich komplett raus. Sind nur die Sachen die mir auffallen. Hoffe, das Hilft Dir trotzdem weiter.

FormName = MyUForm.Name - Das ist nicht die Referenz auf das Objekt sondern nur der Objektname.

Ich bin mir sicher in mordernen Sprachen ist das alles kein Problem mehr, da gibt es dann zig Überladungen. Aber gerade bei VBA kann ich mich dran erinnern, dass das sehr zickig war.
 
Zuletzt bearbeitet:
gehtnetgibtsnet schrieb:
So verstehe ich das.
So isses auch 🙂
Die mit dem Häckche laufen gewöhnlich als Check-Box.

Dein Problem ist, dass du im Grunde eine völlig neue UserForm erzeugen musst [im Wissen um die Zahl der Buttons kann man eine Höhe berechnen und angeben; so was tue ich in AutoIt, was aber en gros damit identisch fiele] und die befüllen - um sie nach Benutzung zu verwerfen. Oder aber du haust alle Inhalte aus der UserForm heraus und legst alles neu an - der typische VBA-Fluch im Umgang mit solchen Objekten und deren Namen, weil: ein Index hilft nicht wirklich viel…
Wenn du einen Button neu erzeugst btauchst du auch den Namen - und den musst du ermitteln weil VBA ebn nicht erlaubt beim Erzeugen eine Namen mitzugeben (schau dir die Syntax für ein neues Tabellenblatt an das einen Namen braucht…)
All das ginge schon, wobei auch irgendwo die Rohdaten liegen müssen wie die Buttons z.B. beschriftet werden. Ich bezweifele, dass dieser Aufwand sich selbst schön modular rechnet.

CN8
 
Dein Gedankenansatz ist falsch..
Du möchtest nicht Userforms dynamisch erstellen, sondern >>dynamisch darstellen<<.
Auf erstellte Controls muss ein Programm grundsätzlich reagieren können. Das ist meines Wissens nach mit VBA nicht volldynamisch möglich, Controls müssen klar benannt und damit bekannt sein !
Radiobuttons heißen in VBA übrigens 'OptionButtons', siehe z.B. https://analysistabs.com/vba-code/excel-userform/optionbutton/
Wenn Du das nie erwähnst gewinnt man den Eindruck dass Du mit der ganzen Klamotte nicht wirklich vertraut bist oder voll im Trüben fischst.

Beispiel wäre daher:
1) Du erstellst explizit die Controls 'OptionButton1', 'OptionButton2' und 'OptionButton3' per code
2) es gibt zugehörige Subs, um auf Events zu reagieren, also

Private Sub OptionButton1_Click
Call OB_Click_info(1)
End Sub

Private Sub OptionButton2_Click
Call OB_Click_info(2)
End Sub

Private Sub OptionButton3_Click
Call OB_Click_info(3)
End Sub

Private Sub OB_Click_Info (iNumber As Integer)
MsgBox("Control geklickt: " & iNumber)
End Sub

Die 3 Controls blendet man bedarfsgerecht ein und aus. Deren Werte werden wie benötigt zugewiesen.
Das Integer iNumber kann auch als Index für ein bestehendes Array verwendet werden, oder was auch immer.

Die Idee ist alle Controls zu erstellen und darauf per entsprechender Sub reagieren zu können.
Du erstellst z.B. eine recht große UserForm mit 10 OptionButtons, blendest aber je nach Bedarf mehrere OptionButtons aus und machst die UserFormn-Größe kleiner.
Bei der nächsten Frage blendest Du einige mehr Buttons ein und machst das Fenster größer.

Das ist nur ein Beispiel.
Bei der Anzahl kann man sich austoben, aus 3 werden schnell 10, noch per copy-paste handhabbar, oder 100.
Bei sehr großen Zahlen würde mir jedoch mit einem Makro und Schleife den Code erstellen lassen, sonst musst Du ne Weile lang die Zahlen anpassen, 'OptionButton99', 'Private Sub 'OptionButton99_Click', usw.

1 UserForm
so viele Buttons erstellen wie maximal benötigt
Button-Text (Werte) nach Bedarf verändern, zuweisen
Button-Sichtbarkeit nach Bedarf verändern, true oder false..
UserForm nach Bedarf verändern, height, width, whatever

Kein Hexenwerk..
 
Zuletzt bearbeitet:
sPeziFisH schrieb:
Du möchtest nicht Userforms dynamisch erstellen, sondern >>dynamisch darstellen<<.
He, da wollte ich doch auch schon hin 😁
sPeziFisH schrieb:
Aber ein gehöriger Krampf. Mir reicht schon die fehlende Kontrolle bei Erzeugung eines Objekts (k)einen Namen mitgeben zu können.
Statische UserForms geht noch weil man durch die Hintertür (VBA-Editor) Namen angibt und damit sogar spielen kann. Aber wenn ich sehe was damit getan werden soll bleibe ich dabei ich dabei: VBA taugt für die Aktion nicht.

CN8
 
cumulonimbus8 schrieb:
Aber wenn ich sehe was damit getan werden soll bleibe ich dabei ich dabei: VBA taugt für die Aktion nicht.
jaa, das ist ja nicht die Diskussion und Frage hier.
Das Thema ist 'Userform mit Radio-Button per VBA dynamisch erstellen', es wird auch klar über VBA gesprochen und das könnte einen berechtigten Grund haben.
Gut ist die Absicht und das Vorhaben von 'gehtnetgibtsnet' zu kennen, dann kann man auch besser helfen.
Und sowas in die Richtung geht sehr gut mit VBA, und das auch ohne Krämpfe.

Du kannst gerne eine Empfehlung für etwas anderes als VBA haben, wegen meiner auch mitgeben, vielleicht etwas besser angebracht, nur ist diese erst einmal nicht das Thema.

Eine UserForm mit 100 Buttons zu erstellen, statisch weil dynamisch geht nichts, muss aber auch nicht, und in einer Schleife stets eine Funktion aufrufen, die nach Integer-Parameter Werte aus aus einem multi-dimensionalem Array verwendet, Button-Text abändert und Buttons ein und ausblendet wenn Text dafür vorhanden, und der Auswahlwert wird auch stets gespeichert, könnte ja hier zielführend sein. Alles schon verwendet, das ist noch nicht einmal groß das Programm.
Statisch erstellen heißt dabei nicht dass man zwingend den GUI-Editor benutzen muss. Nur muss die Control
bekannt und benamst sein. Positionierung geht auch per Code.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: I'm unknown
Beim Versuch mich da duchzubeißen hat mein Magen schon ganz nett gegrummelt als dass ich mit für diese Zecke so was würde antun wollen.

Das Schema was kommen soll ist mir schon kalr, aber wenn ein Button eine Option ist muss die einen Namen haben. Die müssen schon mal vorgebacken sein. Weswegen ich für 10 «Fragen» 1 UserForm ewig verknoten wollte entzieht sich mir. Wenn wenn ich dynamisch sehr oft solche Fragenserien anbieten wollte käme ein vorgesehenes Werkzeug in Frage und keine Rad-Neuerfindung.
Statische Fragenblöcke… Würde ich statisch vorbereiten ohne von Dynamik zu Dynmaik zu hüpfen. Dynamische Fragen und der Aufwand explodiert.

CN8
 
Zurück
Oben