AW: ActiveX-Checkbox-Name auslesen
11.08.2022 13:10:42
Mathias
Erstmal vielen Dank für die vielen Tipps / Hinweise!
@snb
- Man könnte die Checkboxen weglassen, müsste allerdings im VBA dann wieder die Zelle definieren, die mit dem Event überwacht werden soll, daher keine Vereinfachung?
- Bzgl. Datenbank: Prinzipiell sinnvoll, würde aber wohl einen größeren "Umbau" benötigen und dafür ist die Nutzungsdauer (wie lange diese Tabelle noch benötigt wird) wahrscheinlich zu gering.
@volti / Karl-Heinz
Vielen Dank für den Hinweis und die Dateien.
Habe mein "Konstrukt" nun darauf hin aufgebaut und folgenden Code im Modul selbst:
Option Explicit
Public WithEvents coCheckBox As MSForms.CheckBox
'Execute toggle check/unchecked Checkbox ------------
Private Sub ToggleGroups(CheckboxName As String, FirstColumnGroup As String)
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & FirstColumnGroup & "," & IIf(Sheets("sortBatch").OLEObjects(CheckboxName).Object.Value, "True", "False") & ")"
ActiveSheet.Range("A1").Select
End Sub
'Select toggle all Checkboxes ------------
Private Sub ToggleAll()
Dim i As Long
If Sheets("sortBatch").CheckBox0.Value = False Then
For i = 1 To 46 'adjust after adding a new CheckBox
Sheets("sortBatch").OLEObjects("CheckBox" & i).Object.Value = False
Next
ElseIf Sheets("sortBatch").CheckBox0.Value = True Then
For i = 1 To 46 'adjust after adding a new CheckBox
Sheets("sortBatch").OLEObjects("CheckBox" & i).Object.Value = True
Next
End If
End Sub
'Select what to toggle ------------
Private Sub coCheckBox_Click()
Dim FirstColumnGroup As String, CheckboxNumber As Long, CheckboxName As String
CheckboxNumber = Val(Replace(coCheckBox.Name, "CheckBox", ""))
CheckboxName = coCheckBox.Name
Select Case CheckboxNumber
Case 0
ToggleAll
Exit Sub
Case 1
FirstColumnGroup = ActiveSheet.Range("A").Value
Case 2
FirstColumnGroup = ActiveSheet.Range("B").Value
Case 3
FirstColumnGroup = ActiveSheet.Range("D").Value
Case 4
FirstColumnGroup = ActiveSheet.Range("E").Value
Case 5
FirstColumnGroup = ActiveSheet.Range("F").Value
End Select
ToggleGroups CheckboxName, FirstColumnGroup
End Sub
Das Einzige, was mir an dieser Lösung nur aufgefallen ist, dass nach dem ich den Rechner mit geöffneter Tabelle aus dem "Ruhemodus" zurückgeholt habe oder wenn teils Fehlermeldungen aufgetreten sind (beim Anpassen des VBA-Codes), ich das File schließen und neu öffnen musste, da wohl das Array (wieso auch immer) gelöscht wurde und die Checkboxen ohne Funktion waren.
Das ist natürlich "unglücklich", dass es nicht immer funktioniert bzw. zu "Störungen" kommen kann.
@Daniel
Habe mal testweise von ActiveX auf Formular-Checkboxen umgestellt und immer die gleiche Sub aufgerufen.
Bekomme auch mit Application.Caller die Info über Checkbox:
CheckboxNumber = Val(Replace(Application.Caller, "Kontrollkästchen ", ""))
Bin dann nur in ein anderes Problem gerannt. Dieses betraff die An-/Abwahl aller Checkboxen über das "Kontrollkästchen 1".
Hier fehlt mir dann die Info von "FirstColumnGroup", welche sich im Case 2 - X befinden...:
Option Explicit
'Toggle check/unchecked Checkbox ------------
Sub ToggleG()
Dim CheckboxNumber As Long, FirstColumnGroup As String, i As Long
CheckboxNumber = Val(Replace(Application.Caller, "Kontrollkästchen ", ""))
Select Case CheckboxNumber
Case 1 'Toggle all Checkboxes
If ActiveSheet.Shapes("Kontrollkästchen 1").OLEFormat.Object.Value > 0 Then
For i = 2 To 6
ActiveSheet.Shapes("Kontrollkästchen " & i).OLEFormat.Object.Value = True
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & FirstColumnGroup & "," & IIf(ActiveSheet.Shapes("Kontrollkästchen " & i).OLEFormat.Object.Value = xlOn, "True", "False") & ")"
Next
ActiveSheet.Range("A1").Select
Else
For i = 2 To 6
ActiveSheet.Shapes("Kontrollkästchen " & i).OLEFormat.Object.Value = False
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & FirstColumnGroup & "," & IIf(ActiveSheet.Shapes("Kontrollkästchen " & i).OLEFormat.Object.Value = xlOn, "True", "False") & ")"
Next
ActiveSheet.Range("A1").Select
End If
Exit Sub
Case 2
FirstColumnGroup = ActiveSheet.Range("A").Value
Case 3
FirstColumnGroup = ActiveSheet.Range("B").Value
Case 4
FirstColumnGroup = ActiveSheet.Range("D").Value
Case 5
FirstColumnGroup = ActiveSheet.Range("E").Value
Case 6
FirstColumnGroup = ActiveSheet.Range("F").Value
End Select
ToggleGroups CheckboxNumber, FirstColumnGroup
ActiveSheet.Range("A1").Select
End Sub
'Toggle check/unchecked Checkbox ------------
Private Sub ToggleGroups(CheckboxNumber As Long, FirstColumnGroup As String)
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & FirstColumnGroup & "," & IIf(ActiveSheet.Shapes("Kontrollkästchen " & CheckboxNumber).OLEFormat.Object.Value = xlOn, "True", "False") & ")"
End Sub
Ansonsten konnte ich mit dieser Lösung die "Nachteile" von der Klassenprogrammierung von Karl-Heinz vorgeschlagen nicht beobachten (s. o.).
Allerdings werden die einzelnen Cases nicht erneut im Loop angesprochen (da anderer Aufbau).