Anzeige
Archiv - Navigation
1892to1896
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

ActiveX-Checkbox-Name auslesen

ActiveX-Checkbox-Name auslesen
10.08.2022 10:51:58
Mathias
Hallo zusammen,
habe in einem Tabellenblatt einige ActiveX-Checkboxen, die Daten-Gruppen für Diagramme ein- und ausblenden.
Jede neue Checkbox erhält immer wieder den selben Code, wobei sich eigentlich immer nur die 2 Variablen "CheckboxNumber" und "FirstColumnGroup" ändern:

Private Sub CheckBox1_Click()
Dim FirstColumnGroup As String, CheckboxNumber As Long
CheckboxNumber = 1
FirstColumnGroup = ActiveSheet.Range("NameDerErstenSpalteDerGruppe").Value
ToggleGroups CheckboxNumber, FirstColumnGroup
End Sub
Ich würde gerne wissen, wie man den Namen der Checkbox (CheckBox1) bzw. nur die eigentliche Ziffer auslesen kann OHNE jedes mal den Namen anzupassen?
CheckBox1.Name ist damit nicht gemeint, da ich hier jedes mal ebenfalls anpassen müsste....da ist die momentane Zuweisung weniger Aufwand.
Alle Varianten im Netz haben bei mir bis jetzt nicht funktioniert.
Bei "ActiveControl.Value" bzw. "ActiveControl.Object.Value" sagt er mir "Variable nicht definiert."
Aufgerufen wird dann der eigentliche "Toggle" mit folgendem Code:

Private Sub ToggleGroups(CheckboxNumber As Long, FirstColumnGroup As String)
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & FirstColumnGroup & "," & IIf(OLEObjects("CheckBox" & CheckboxNumber).Object.Value, "True", "False") & ")"
ActiveSheet.Range("A1").Select
End Sub
Ich würde ebenfalls gerne wissen, ob der obige "Toggle"-Code inkl. Checkbox-Subs irgendwie vereinfacht werden kann (z. B. in einer Case-Abfrage)?
Je mehr Checkboxen dazu kommen, umso mehr müssen die Subs kopiert und angepasst werden....der einzige eigentliche Mehrwert dabei ist ja nur jedes Mal der "NameDerGruppe".
Bin leider kein VBA-Experte...aber würde das nicht über eine Case-Schleife irgendwie funktioneren?
Sinnbildlich, wie folgt angedeutet:

"Auslesen des Namen der auslösenden Checkbox und extrahieren der Ziffer"
"Anhand der Ziffer Anwahl des nachfolgend definierten Case i"
For i = 1 to 100
Case 1
n = "NameDerErstenSpalteDerGruppe1"
Case 2
n = "NameDerErstenSpalteDerGruppe2"
Next
Application.ExecuteExcel4Macro "SHOW.DETAIL(2," & n & "," & IIf(OLEObjects("CheckBox" & i).Object.Value, "True", "False") & ")"
ActiveSheet.Range("A1").Select
Leider fehlen mir die Infos, wie das Ganze "in Realität" mit Verlinkung zu den Checkboxen eleganter umgesetzt werden müsste.
Über Hilfe wäre ich sehr dankbar.
Grüße
Mathias

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 11:08:36
Oberschlumpf
Hi Mathias,
a) zeig bitte per Upload eine Bsp-Datei mit allem, was notwendig ist, um deine Beschreibung zu verstehen
b) erklär bitte, wann genau und wie eine neue CheckBox hinzukommt
Ciao
Thorsten
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 12:51:09
Mathias
Hallo Thorsten,
vielen Dank für deine Nachfrage:
1) Ich habe die Datei bereinigt und auf wenige Datengruppen beschränkt. Diese ist unter folgendem Link erreichbar: https://www.herber.de/bbs/user/154581.xlsm
- Die Datei soll die Merkmale P1-P16 von jedem Messzyklus einer gesamten Messreihe (=Gruppe) in den linken Diagrammen darstellen.
- Über "diagram data" soll der Benutzer die einzelnen Messreihen (über ActiveX-Checkboxen) ein- und ausblenden können.
2) Bei einer neuen Messreihe wird momentan noch alles manuell angelegt:
- Daten hinter der letzten Gruppe einfügen + formatieren
- Gruppieren und teils verlinken, sowie ggf. Diagramme anpassen
- erster Zelle der Gruppe mit einem Namen versehen
- neue Checkbox einfügen (mit automatisch fortlaufender Nummer)
- In VBA:
- letzte Checkbox-Sub kopieren und die Ziffer +1 inkrementieren
- CheckboxNumber anpassen & Namen bei FirstColumnGroup eintragen
- For-Schleife für alle Checkboxen inkrementieren
Den VBA-Teil würde ich im ersten Schritt (wie in dem Beitrag zuvor erwähnt) einfacher gestalten wollen.
Anzeige
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 13:02:29
snb
Verzichte auf AciveX Checkboxes.
Verwende Font 'Webdings', Werte "a"
Dan brauchst du nur das Worksheet_Change Event.
PS. Es wäre besser die Messdaten als echter Database (dynamsiche Tabelle) in einem separaten Arbeitsblatt zu strukturieren.
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 12:51:18
volti
Hallo Matthias,
bei vielen Checkboxen (Active-X-Versionen) und der Wahrscheinlichkeit, dass neue hinzu kommen und andere wegfallen, könntest Du auf Klassenprogrammierung zurückgreifen.
Ein vereinfachtes Beispiel findest Du in der anliegenden Datei.
Mit Öffnen der Arbeitsmappe werden alle vorhandenen Checkboxen in ein Array eingelesen. Wenn dann auf eine Checkbox geklickt wird, wird immer die gleiche Sub im Klassenmodul clsCheckbox angesprungen, in der Du dann die entsprechende Checkbox z.B. anhand des Namens rausfischen kannst und weiterführende Aktionen durchführen kannst.
Probiere es einfach mal aus.
Checkbox-Demo.xlsb
viele Grüße
Karl-Heinz
Anzeige
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 13:10:47
volti
Hallo, Nachtrag.
SNB's Vorschlag ist zu empfehlen.
Falls Du bei den Checkboxen bleiben möchtest, hier in Deine Datei mal eingebaut.
https://www.herber.de/bbs/user/154583.xlsm
Gruß
KH
AW: ActiveX-Checkbox-Name auslesen
10.08.2022 13:35:11
Daniel
HI
wenn nan viele Checkboxen mit fast gleichem Code braucht, bieten sich folgende alternativen an:
- Formularfelder anstelle von ActiveX. Formularfeldern kann man ein Makro aus dem allgemeinen Modul zuordnen, welches dann für alle Checkboxen verwenden kann. in diesem Makro kann man mit Application.Caller den Namen der aufrufnenden Checkbox ermitteln.
beim Kopieren einer Checkbox wird die Makroverknüpfung automatisch mit übernommen
es reicht also ein einziges Makro für alle Checkboxen (Klassenprogrammierung light)
- Multiselect-Listbox anstelle von einzelnen Checkboxen verwenden. Der Listbox kann man einfacher Elemente hinzufügen und man hat nur ein Steuerelement, das programmiert werden muss.
- wenn die Checkboxen einzelnen Excelzeilen zugeordnet sind, dann ist es einfacher, auf boxen zu verzichten und einfach nur "x" (oder was anderes) in die Zellen einzutragen und den erforderlichen Code über das Change-Event ausführen zu lassen.
Gruß Daniel
Anzeige
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).
Anzeige
AW: ActiveX-Checkbox-Name auslesen
11.08.2022 14:20:41
volti
Hallo Matthias,
vielen Dank für Deine Rückmeldung.
PS: Die von Daniel angeregte Application.Caller-Version benutze ich auch meist. Es müssen dann aber Formblatt-Checkboxen sein.
Für die Active-X-Version bleibt da nur die Klassenprogrammierung....
Globale Variablen sind nach einem nicht abgefangenen Code-Fehler meist zurückgesetzt. Das gilt z.B. auch für die Ribbon-Variable, die den Zeiger auf ein eigenes Ribbon enthält, oder andere globale Variablen.
Aber die Datei muss man nicht zu machen und wieder öffnen. Du kannst das Array durch erneuten Aufruf der Sub Checkbox_Initiate() doch z.B. auch bei Aktivierung des Blattes neu einlesen oder evtl. Fehler mit On error abfangen und das Array neu einlesen usw..
Für die Klassenprogrammierung kann man auch anstatt eines Arrays eine Collection nehmen. Da weiß ich aktuell aber nicht, ob die nicht auch weg ist nach einem Fehler. Müsste ich mal prüfen...
Gruß
Karl-Heinz
Anzeige
AW: ActiveX-Checkbox-Name auslesen
11.08.2022 14:25:50
Daniel
Range("A").Value
hast du einen Namen "A" im Tabellenblatt vergeben?
Gruß Daniel
AW: ActiveX-Checkbox-Name auslesen
11.08.2022 15:01:27
Mathias
Hallo Daniel,
ja das sind Namen.
Ich habe für jeweils die erste Zelle einer Gruppe einen Namen vergeben, um einfach im Tabellenblatt selbst zusätzliche Spalten anlegen zu können und nicht jedes Mal die Zellenangaben im VBA bei allen Einträgen (Checkboxen) ändern zu müssen.
Zum Problem selbst ... eigentlich wäre nur folgende Ergänzung notwendig, damit der Code für alle Checkboxen funktioniert:

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
>>> Hole mir den von Case i zugewiesene Variableninhalt für FirstColumnGroup >> Hole mir den von Case i zugewiesene Variableninhalt für FirstColumnGroup 
Die Frage ist nur, ob und wie man das in VBA umsetzen könnte oder ich für das Togglen aller Checkboxen doch einen anderen Weg gehen müsste.
Anzeige
AW: ActiveX-Checkbox-Name auslesen
15.08.2022 09:35:59
Mathias
Hallo zusammen,
hat niemand eine Idee wie man mit >>> Hole mir den von Case i zugewiesene Variableninhalt für FirstColumnGroup
AW: ActiveX-Checkbox-Name auslesen
11.08.2022 14:52:51
Mathias
@Karl-Heinz
Vielen Dank für die Denkanstöße, auch mit dem Abfangen mit "on error", etc.
Für mich persönlich ist das interessant.
Allerdings muss ich an diesem Punkt wohl abwägen, wie weiterhin störanfällig _meine_ Implementierung wäre, da die Datei auch von (was VBA betrifft) absolut unwissenden Personen bedienbar sein sollte. Öffnen, ggf. Größe skalieren und Checkboxen anklicken bekommt jeder hin ;-)
(Ich kann ja schlecht eine Anleitung mitliefern, die beschreibt wo man alles Hinklicken sollte oder welchen Code man wo eingeben muss, um das Einlesen des Arrays neu anzustoßen. Ich denke das ist verständlich ;-)
Mir geht es bei meiner Anfrage eigentlich primär darum zu verstehen, wie man es besser umsetzen könnte und was dabei der "richtige/sinnvollste" Weg wäre.
(Mir macht es auch nichts aus 3 anstatt 2 Variablen in VBA zu ändern, wenn neue Daten hinzukommen).
Wie man sieht hatte ich mit VBA noch nicht so viel am Hut, bin aber gewillt dazu zu lernen, um später Lösungsansätze auch auf andere Problemstellung zu übertragen ;-)
Daher präferiere ich momentan auch eher die Form-Checkboxen, wenn ich hinter das Rästel mit der fehlenden Info bei allen Checkboxen kommen würde :D
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige