UF btn mit loop erstellt jetzt anspreche
13.05.2022 11:59:23
JoTu
Ich habe eine Liste mit Datum (Spalte "A") und Namen (Spalte "B"). In einer Userform sollen alle Namen als Buttons angezeigt werden. Dazu habe ich eine Schleife gebaut, die die Buttons erstellt und gruppiert. Parallel dazu sind den Namen Monate aus Spalte "A" zugeordnet. Meine Idee: Wenn ich in der Userform den Button mit dem Namen anklicke, dann erscheint eine zweite Button-Gruppe mit den dem Namen zugehörigen Monaten.
Problem: Ich kann die Buttons gerade nicht ansprechen (Button_Click), weil sie ja eigentlich nicht existieren, sondern erst durch UserForm_Initalize erstellt werden. Gibt es evtl. einen Weg über Function, das dennoch zu lösen? Ich nehme auch gern Verweise entgegen, mit welchen Methoden das möglich ist. Ich habe dazu leider bisher keine gefunden. Codes freuen mich natürlich auch...
Meine Arbeitsmappe:
https://www.herber.de/bbs/user/153049.xlsm
Mein Code für die UserForm:
Private Sub UserForm_Initialize()
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim ws As Worksheet
Set ws = wb.ActiveSheet
Dim opt As Control
Dim i As Integer
i = 0
lrow = ws.Cells(Rows.Count, 27).End(xlUp).Row - 1
mrow = ws.Cells(Rows.Count, 28).End(xlUp).Row
For k = 2 To lrow 'Button Namen erstellen
Set opt = UserForm1.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True)
opt.Caption = ws.Cells(k, 27).Value
opt.Top = opt.Height * i
opt.GroupName = "name"
opt.Left = 10
Me.Width = 200
mehght1 = 40 + opt.Height * (i + 3)
i = i + 1
Next k
' (!) Der folgende Part soll eigentlich ausgeführt werden, wenn ein Button von oben angeklickt wird. Also wenn ich "Thomas" anklicke, dann sollen nur die Monate für Thomas erscheinen. Der Code um die Monate zu extrahieren steht unten bzw. siehe Arbeitsmappe.
i = 0
Dim m As Integer
For m = 2 To mrow 'Button Monate erstellen
Set opt = UserForm1.Controls.Add("Forms.OptionButton.1", "radioBtn" & i, True)
opt.Caption = Format(ws.Cells(m, 28).Value, "mmmm")
opt.Top = opt.Height * i
opt.GroupName = "monat"
opt.Left = 128
Me.Width = 200
mehght2 = 40 + opt.Height * (i + 3)
i = i + 1
Next m
If mehght1 > mehght2 Then
mehght = mehght1
Else: mehght = mehght2
End If
Me.Height = mehght
Me.CommandButton1.Top = Me.Height - 70
Me.CommandButton1.Left = 10
Me.CommandButton2.Top = Me.Height - 70
Me.CommandButton2.Left = Me.CommandButton1.Left + Me.CommandButton1.Width + 10
End Sub
Code für die Erstellung der Monate. Dieser solle eigentlich laufen, wenn ich einen Button anklicke. Aktuell filtert er zu Testzwecken nur einen konkreten Namen, soll sich aber eigentlich auf die Aktivierung eines Buttons beziehen. Der Name würde dann durch die Caption des aktiven Buttons ersetzt werden.
Private Sub CommandButton2_Click()
Dim wb As Workbook
Set wb = ActiveWorkbook
Dim ws As Worksheet
Set ws = wb.Sheets(1)
Dim lrow As Integer: lrow = Cells(Rows.Count, 1).End(xlUp).Row
Dim rng As Range: Set rng = ws.Range(ws.Cells(1, 1), ws.Cells(lrow, 2))
Dim x As Integer: x = 0
Dim i As Integer
Dim MonArr() As Variant
For i = 1 To rng.Rows.Count
If rng.Cells(i, 2).Value = "Thomas" Then
Dim dat As Date: dat = rng.Cells(i, 1).Value 'Datum ermitteln
Dim mon As String: mon = Month(dat)
Dim val As String
If Len(mon) = 1 Then
val = ".0" & mon & "."
ElseIf Len(mon) = 2 Then
val = "." & mon & "."
End If
Dim srch As Variant: srch = Filter(MonArr, val) 'Monate vergleichen
If x = 0 Then
GoTo weiter
Else:
If UBound(srch) > -1 Then
Else:
weiter:
ReDim Preserve MonArr(x) 'Array füllen
MonArr(x) = rng.Cells(i, 1).Value
End If
End If
x = x + 1
val = ""
End If
Next
For i = 0 To x - 1
ws.Cells(i + 2, 28).Value = MonArr(i)
ws.Cells(i + 2, 28).NumberFormat = "mmmm"
Next i
ws.Range(ws.Cells(2, 28), ws.Cells(x + 4, 28)).Sort Key1:=Range("AB" & "2"), Order1:=xlAscending
End Sub
Besten Dank für alle Vorschläge :)