Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

VBA Click-Routine Option-Button

Forumthread: VBA Click-Routine Option-Button

VBA Click-Routine Option-Button
19.07.2025 17:24:27
Joschi Witchcraft
Hallo Forum.

Auf der Basis von
https://www.herber.de/xldialoge/uf_form13.html

habe ich mir eine temporäre Userform erstellt. Nun will ich mit Hilfe von Option-Buttons eine Auswahl treffen lassen..

Die Anzahl der Options-Button ist variabel, je nachdem, wie viele Begriffe zur Auswahl stehen.

Die Buttons und die jeweilige Click-Routinen werden per VBA-Code generiert und funktionieren grundsätzlich.
Auf die Nutzung einer eigenen Klasse um die Buttons zuusammenzufassen, möchte ich verzichten

Ein kleines Problem besteht aber:

Wenn ich zum Beispiel in der "OptionButton3_Click()"-Routine lande, interessiert mich der Inhalt von OptionButton3.Caption.

Frage: wie kann ich dieses Feld ansprechen, wenn ich nicht in jeder generierten Click-Routine bereits den zugehörigten Namen generiere?

Wenn ich den Inhalt von .Caption habe, soll eine gemeinsame Routine aufgerufen werden, welche dann die Antwort bereitstellt.. Dabei wird der ,Caption-Inhalt als Paraneter mitgegeben.

Beispiel;: Call RadioClick ???.caption

Gruß Josch
Anzeige

17
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Click-Routine Option-Button
19.07.2025 17:54:38
Daniel
Hi

und warum nicht einfach eine Listbox oder Combobox anstelle der Optionbuttons?

Gruß Daniel
AW: VBA Click-Routine Option-Button
19.07.2025 18:32:07
Kuwer
Hallo Josch,

Private Sub OptionButton3_Click()

Call RadioClick(ActiveControl.Caption)
End Sub


Gruß, Uwe
AW: VBA Click-Routine Option-Button
19.07.2025 20:08:25
Joschi Witchcraft
Hallo Uwe.

Danke für Deinen Vorschlag. Leider liefert der nur einen leeren String.

Gruß Joschi
Anzeige
AW: VBA Click-Routine Option-Button
20.07.2025 17:14:28
Ulf
Hi,
Uwe hat schon den richtigen Weg beschritten.Kplt ~ so
Sub CallNewForm()

ThisWorkbook.Save
Application.VBE.MainWindow.Visible = False
Call CreateUF
Call CreateCode
Call ShowUf
End Sub

Private Sub CreateUF()
Dim uf As Object
Dim cmd As MSForms.CommandButton
Dim chb As MSForms.OptionButton
Dim iRow As Integer, iTop As Integer
iRow = 1
iTop = 10
Set uf = ThisWorkbook.VBProject.VBComponents.Add(3)
Do Until IsEmpty(Cells(iRow, 1))
Set chb = uf.designer.Controls.Add("Forms.OptionButton.1")
With chb
.Top = iTop
.Left = 5
.Width = 100
.Height = 15
.Caption = Cells(iRow, 1).Value
End With
iTop = iTop + 20
iRow = iRow + 1
Loop
Set cmd = uf.designer.Controls.Add("Forms.CommandButton.1")
With cmd
.Caption = "OK"
.Accelerator = "o"
.Width = 100
.Height = 25
.Left = 110
.Top = 10
.Name = "cmdOK"
End With
With uf
.Properties("Name") = "frmDogs"
.Properties("Caption") = "Treffen Sie Ihre Auswahl:"
.Properties("Width") = 230
.Properties("Height") = iTop + 100
End With
End Sub

Private Sub CreateCode()
Dim iRow As Integer
Dim sCode As String
Dim lngZeile As Long
Dim strProc As String
With ThisWorkbook.VBProject.VBComponents("frmDogs").CodeModule
.CreateEventProc "Click", "cmdOK"
iRow = .ProcBodyLine("cmdOK_Click", 0)
sCode = " Dim iRow as Integer" & vbLf
sCode = sCode & " For iRow = 0 to " & _
Range("A1").CurrentRegion.Rows.Count - 1 & vbLf
sCode = sCode & " If Controls(""OptionButton"" & iRow + 1)" & _
".Value = True Then" & vbLf
sCode = sCode & " Cells(iRow + 1, 1)" & _
".Interior.ColorIndex = 6" & vbLf
sCode = sCode & " End If" & vbLf
sCode = sCode & " Next iRow" & vbLf
sCode = sCode & " Unload Me" & vbLf
.InsertLines iRow + 1, sCode

lngZeile = 1
Do Until IsEmpty(Cells(lngZeile, 1))
strProc = "OptionButton" & lngZeile
iRow = .CreateEventProc("Click", strProc)
strProc = strProc & "_Click"
iRow = iRow + 1
iRow = .ProcBodyLine(strProc, 0)
sCode = "Call RButton(ActiveControl.Caption)" & vbLf
.InsertLines iRow + 1, sCode
lngZeile = lngZeile + 1
iRow = 1
Loop
End With
End Sub

Private Sub ShowUf()
Columns(1).Interior.ColorIndex = xlColorIndexNone
frmDogs.Show
'TESTEN
'Exit Sub
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents("frmDogs")
End With
End Sub

Public Sub RButton(ByVal strCaption As String)
MsgBox strCaption
End Sub

hth
Ulf
Anzeige
AW: VBA Click-Routine Option-Button
20.07.2025 19:50:34
Joschi Witchcraft
Hallo Ulf.

Danke für die "Überarbeitung" das von mir erwähnten Codes bei Herber,.

Mir ist es mehrfach gelungen, dass die Ausführung gescheitert ist. Ursache war, dass die alte Userform nicht gelöscht wurde - was auch immer die Ursache dafür war. Nachdem ich die alte Userform manuell gelöscht hatte, hat wieder alles funktioniert.

Dein neue Code hat bewiesen, dass er funktioniert. Er kann für eigene Entwicklungen nun ein Vorbild sein.

Was ich in vielen Beispielen bemängle: sie werden auch von weniger erfahrenen Entwicklern als Basis verwendet. Und dann kommt beim ersten Aufruf gleich eine Fehlermeldung, mit der viele vermutlich nichts anzufangen wissen. Ursache; es fehlt ein Verweis. Im konkreten Fall ist es der Verweis auf "Microsoft Froms 2.0 Object Library" (fm20.dll).

Mein Problem in diesem Zusammenhang: in der Verweis-Liste taucht dies nicht auf - warum auch immer. Herber-Forum hatte eine Code, diesen Verweis per Code zu setzen. Erledigt.

Gruß Joschi
Anzeige
AW: VBA Click-Routine Option-Button
20.07.2025 19:54:13
schauan
Hallo Joschi,
Der Verweis kommt automatisch wenn man einmal manuell ein Userform einfügt. Wenn man es wieder löscht, bleibt er
AW: VBA Click-Routine Option-Button
21.07.2025 10:06:00
Joschi Witchcraft
Hallo Schaun.

Du unterstellst auch, dass das mit dem Einrichten einer Userform jedem bekannt ist.

Wenn ich den bearbeiteten Code von Ulf ausführe, erhalte ich folgende Meldung:

Userbild

Die wenigsten Tester wissen, das jetzt zu tun ist. Das meinte ich mit meiner Bemerkung.

Gruß Joschi

Anzeige
AW: VBA Click-Routine Option-Button
21.07.2025 10:38:40
schauan
Hallo Joschi,

nein, ich unterstelle da nix. Das ist nur ein Tipp, wenn man den Verweis nicht findet :-) Ich kann den sonst auch nicht finden :-(
Bitte nicht wieder negativ verstehen, ich gehe normalerweise davon aus, wenn jemand mit Makros arbeitet, das er da auch weiß, wie man ein Userform einfügt. Klar, das muss nicht sein, wenn man sich die Datei aus dem Netz geholt und vorher noch nix damit zu tun gehabt hat.

Also, ausführlich beschrieben, im VBA-Editor über das Menü Einfügen | Userform eins einfügen, und wenn man es nicht braucht, gleich wieder entfernen. Dann hat man den Verweis.
Anzeige
AW: VBA Click-Routine Option-Button
21.07.2025 15:36:22
Joschi Witchcraft
Hallo schauen.

Es ging mir nicht um die Frage, wie man eine Userform erstellen bzw. einfügen kann, sondern darum, dass der fehlenden Verweis durch das Einfügen einer Userform automatisch gesetzt wird.

Gruß Joschi.
AW: VBA Click-Routine Option-Button
22.07.2025 11:31:12
Oberschlumpf
Hi,

und du hast nicht verstanden, was Schauan dir erklärt hat.

Wenn mal der Verweis auf "Microsoft Froms 2.0 Object Library" fehlen sollte (kann immer wieder mal passieren), dannn.....und jetzt kommts!...pass also auf!

Musst du nicht mühselig über Extras/Verweise nach "Microsoft Froms 2.0 Object Library" suchen, aktivieren, OK

SONDERN du fügst im VBE einfach per Hand ein Userform(ular!) hinzu, entfernst es gleich wieder - und schwupps! - der Verweis auf "Microsoft Froms 2.0 Object Library" ist nun automatisch gesetzt.

Schauan hat dir - nicht - erklärt, wie man ein Userform manuell hinzufügt/entfernt, er hat nur darauf hingewiesen, dass es mit Hilfe von manuellem Hinzufügen eines Userforms viel einfacher ist, den fehlenden Verweis auf "Microsoft Froms 2.0 Object Library" zu aktivieren.

Verstanden?


Für deine eigtl Frage bzgl Click auf Opt.bttn würde ich die Klassenprogrammierung empfehlen = dazu gibt es viele Tipps/Anleitungen im Inet.

Ciao
Thorsten
Anzeige
AW: VBA Click-Routine Option-Button
22.07.2025 14:19:33
volti
Hallo zusammen,

da die Userform ja komplett über VBA erstellt wird, ist (anders als bei anderen Fällen) m.E. hier keine Klassenprogrammierung erforderlich.

M.E. muss man auch nicht getrennte Subs für die Erzeugung der Komponenten und der entsprechenden Eventscode haben.
Warum nicht alles in einem Abwasch abhandeln und mit etwas gestrafften Code den gewünschten Captiontext zur Übergabe an die weiterführende Sammel-Sub direkt implementieren.

Hier mein Vorschlag als Anregung:
Sub CallMyDynUserform()

Call CreateUF
Call ShowUF
End Sub

Private Sub CreateUF()
Dim oBtn As Object
Dim iRow As Integer, iTop As Integer, iCodeRow As Long
iRow = 1
iTop = 10

With ThisWorkbook.VBProject.VBComponents.Add(3)
Do Until IsEmpty(Cells(iRow, 1))

' Button erstellen
Set oBtn = .designer.Controls.Add("Forms.OptionButton.1")
With oBtn
.Top = iTop
.Left = 5
.Width = 100
.Height = 15
.Caption = Cells(iRow, 1).Value
End With
' Code dazu
With .CodeModule
.CreateEventProc "Click", oBtn.Name
iCodeRow = .ProcBodyLine(oBtn.Name & "_Click", 0)
sCode = " Call RadioClick('" & oBtn.Caption & "')"
.InsertLines iCodeRow + 1, Replace(sCode, "'", Chr(34))
End With
' Nächste Position und Nr
iTop = iTop + 20
iRow = iRow + 1
Loop

' Ok-Button erstellen
Set oBtn = .designer.Controls.Add("Forms.CommandButton.1")
With oBtn
.Caption = "OK"
.Accelerator = "o"
.Width = 100
.Height = 25
.Left = 110
.Top = 10
.Name = "cmdOK"
End With
' Code dazu
With .CodeModule
.CreateEventProc "Click", oBtn.Name
iCodeRow = .ProcBodyLine(oBtn.Name & "_Click", 0)
sCode = " Dim iRow as Integer¶¶" _
& " For iRow = 0 to " & Range("A1").CurrentRegion.Rows.Count - 1 & "¶" _
& " If Controls(""OptionButton"" & iRow + 1)" & ".Value = True Then¶" _
& " Cells(iRow + 1, 1)" & ".Interior.ColorIndex = 6¶" _
& " End If¶" _
& " Next iRow¶" _
& " Unload Me"
.InsertLines iCodeRow + 1, Replace(sCode, "¶", vbLf)

' Terminate-Event (optional)
.CreateEventProc "Terminate", "Userform"
iCodeRow = .ProcBodyLine("Userform_Terminate", 0)
.InsertLines iCodeRow + 1, " Unload Me"
End With

' Userform anpassen
.Properties("Name") = "frmDogs"
.Properties("Caption") = "Treffen Sie Ihre Auswahl:"
.Properties("Width") = 230
.Properties("Height") = iTop + 100
End With
End Sub

Private Sub ShowUF()
Columns(1).Interior.ColorIndex = xlColorIndexNone
frmDogs.Show
With ThisWorkbook.VBProject
.VBComponents.Remove .VBComponents("frmDogs")
End With
End Sub

Public Sub RadioClick(ByVal strCaption As String)
MsgBox strCaption
End Sub


Gruß
Karl-Heinz
Anzeige
AW: VBA Click-Routine Option-Button
19.07.2025 19:04:18
volti
Hallo,

neben der Kuwer-Lösung...

Wenn ich es richtig verstanden habe, wird doch für jeden Radiobutton per VBA ein Clickevent programmiert, welches dann ein Sammel-Sub aufruft.
Zum Zeitpunkt der Erstellung muss doch der Inhalt bekannt sein. Da könnte man schon zu diesem Zeitpunkt das entsprechend vorprammieren.
Der Radiobuttontext wird sich ja nach der Erstellung nicht mehr ändern!?

Also per VBA:
Private Sub OptionButton3_Click()

Call RadioClick("Mein RB-Text")
End Sub


Gruß
KH

Anzeige
AW: VBA Click-Routine Option-Button
19.07.2025 19:26:59
Daniel
Mit Listbox anstelle der Optionbuttons brauchst du einfach diesen Code im Click-Event der Listbox:

if Listbox1.ListIndex > 0 then Application.Run Listbox1.Value



That's all. Egal wie viele Makros du hast.


AW: VBA Click-Routine Option-Button
20.07.2025 09:08:24
schauan
Hallöchen,

im Prinzip so

Private Sub OptionButton1_Click()

MsgBox WelcherOB()
End Sub

Private Function WelcherOB() As String
Dim ctrOB As Control
WelcherOB = ""
For Each ctrOB In Me.Controls
If TypeOf ctrOB Is MSForms.OptionButton Then
If ctrOB.Value = True Then WelcherOB = ctrOB.Name
End If
Next
End Function


Wenn Du die OB in verschiedenen Frames oder Pages hast können mehrere WAHR sein. Du müsstest dann weiter differenzieren.
Anzeige
AW: VBA Click-Routine Option-Button
21.07.2025 15:31:51
Daniel
Hi.
Mach ne einfache Listbox und schreibe die Texte, die du als Caption verwenden willst, in die Listbox

Listbox1.AddItem "Text1"

Um dann den Code auszuführen, kommt ins Click-Event der Listbox:

If Listbox1.Listindex >= 0 Then Call Radioclick(Listbox1.text)

That's all.
Machs nicht unnötig kompliziert

Gruß Daniel
Anzeige
AW: VBA Click-Routine Option-Button
19.07.2025 18:03:46
Joschi Witchcraft
Hallo Daniel,

weil ich weder mit Listbox noch mit ComboBox Erfahrungen habe. Außerdem gibt es als Alternative die Nutzung als CommandButton.

Darum.

Gruß Joschi
AW: VBA Click-Routine Option-Button
19.07.2025 18:28:39
Daniel
Listboxen sind bei variabler Anzahl an Auswahlmöglichkeiten einfacher zu handhaben.

Du kannst einfach Elemente hinzufügen
Listbox1.Additem "Text1"

Der Ausgewählte Wert steht in
Listbox1.Value

Oder auch als Index- bzw. Zeilennummer des gewählten Eintrags
Listbox1.ListIndex

Wobei ein -1 bedeutet, dass noch keine Auswahl getroffen wurde und 0 die Nummer des ersten Eintrags ist.

Du kannst auch alle Einträge in einer Schleife durchgehen:
Dim i as Long 

For i = 0 to Listbox1.ListCount - 1
Debug.Print Listbox1.List(i, 0)
Next


Das Click-Event löst aus wenn ein Element ausgewählt wird, wie oben gezeigt kannst du ermitteln welches. Du benötigst also nur ein Event Makro, egal wie viele Auswahlmöglichkeiten es gibt.

Über eine einfache Einstellung in den. Eigenschaften (ListStyle) kannst du auch noch die Radiobuttons hinzufügen, dann sieht das ganze auch aus wie eine Gruppe Optionbuttons


Du kannst damit als Anfänger sehr viel machen, für was du schon deutliches Fortgeschrittenen-Niveau brauchst, wenn du das mit zur Laufzeit erstellten Optionbuttons realisieren willst.

Die einzige Einschränkung der Listbox ist, dass die Auswahlwerte untereinander ausgegeben werden, dh Optionbuttons würde ich nur verwenden, wenn diese "wild" in der Userform verstreut liegen müssen.

Gruß Daniel
Anzeige

Forumthreads zu verwandten Themen

Anzeige