Position von Kontrollkästchen per VB-script ermitteln
#1

.xlsm   Test.xlsm (Größe: 21,3 KB / Downloads: 7)
Hallo, ich suche Hilfe bei folgendem Problem:

Eine Tabelle mit x Kontrollkästchen (Im Beispiel sind es z.B. 29) soll z.B. eine Tabelle für fehlende oder vorhandene Teile darstellen.
In dieser Tabelle ist die hellblaue Zeile (0-20) und Spalte (0-9)  ein Index für die Nummer des  jeweiligen Kontrollkästchens.
Das Kontrollkästchen im Feld "C7" hat also die Nummer "14"
Die Anzahl der Kontrollkästchen variiert von Tabellenblatt zu Tabellenblatt.

Per VB-Makro wird die Gesamtzahl, die Anzahl der vorhandenen und die Anzahl der fehlenden Teile  per VB ermittelt (Zelle E15-E17).
Ab der Zelle "B23" wird per VB für jedes Kontrollkästchen (Teil) geschrieben, ob es aktiv (vorhanden) ("1") oder passiv (nicht vorhanden) ("0") ist.
Die Reihenfolge dafür geht jedoch von links nach rechts und von oben nach unten, also nicht der Reihe nach - Teil01 bis Teil29
Bis hier gibt es noch keine Probleme.

Nun soll aber zusätzlich noch eine fortlaufende Liste der Nummern aller fehlenden Teile (passiven Kontrollkästchen) ausgegeben werden.
Im Beispiel habe ich dies zum Verständnis mal "rot" mit Hand geschrieben.

Ich finde aber keinen Weg für ein vernünftiges VB-script.
Vielleicht kann mir hier jemand helfen.

Vielen Dank schon im Voraus
Bödefeld
Top
#2
Hallo Bödefeld,

in CB.ShapeRange.Name hast Du die Nummer des Kontrollkästchens.
Allerdings habe ich in Deiner Datei in C7 das Kontrollkästchen 30 und nicht 14 ?
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#3
Hallo André,
Dank für Deine schnelle Antwort, aber Du hast wohl das Problem noch nicht richtig verstanden.
Die Kästchen stellen hier in diesem Beispiel eine Matrix mit 19 Positionen (Teilen) dar, die in drei Spalten und  in neun Zeilen angeordnet ist.
Es sind die Positionen der Kästchen gemeint, die durch die hellblaue Legende (Zeile 2 - waagerecht und Spalte A - senkrecht) bestimmt werden.
Das Kästchen im Feld "C8" steht in der 2. Spalte und in der 5. Zeile, also 10+5= Teil Nr.15 
Das Kästchen im Feld "D12" steht in der 3. Spalte und in der  9. Zeile, also 20+9= Teil Nr.29
Diese Teil-Nummern aller passiven Kästchen sollen waagerecht nebeneinander aufgelistet werden.


Gruß
Bödefeld
Top
#4
Hallöchen,

sind die Kästchen genau über den Zellen ausgerichtet? Da könnte man mit der Eigenschaft TopLeftCell arbeiten.
...
Debug.Print CB.TopLeftCell.Address
...
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#5
Hallöchen,

also, die Kontrollkästchen sind wohl nicht alle mit der Ecke genau über der darunter liegenden Zelle positioniert.
Ich habe hier mal ein Makro, was sowohl die Position genau einhält als auch Namen vergibt, sodass man nicht mehr unbedingt die Position benötigen würde..

Code:
Sub Add_Checkboxen()
'Variablendeklarationen
'Checkbox
Dim cboShape As CheckBox
'Integer
Dim iCnt1%, iCnt2%
'Schleife ueber alle Zeilen
For iCnt1 = 0 To 9
  'Schleife ueber alle Spalten
  For iCnt2 = 0 To 2
    'Checkbox einfuegen und auf linke obere Ecke der Zelle positionieren
    Set cboShape = ActiveSheet.CheckBoxes.Add(Cells(iCnt1 + 3, iCnt2 + 2).Left, Cells(iCnt1 + 3, iCnt2 + 2).Top, 24, 10)
    'Name der Checkbox anhand Schleifenzaehlern festlegen
    cboShape.Name = "cbo_" & iCnt1 + iCnt2 * 10
  'Ende Schleife ueber alle Spalten
  Next
'Ende Schleife ueber alle Zeilen
Next
End Sub
.      \\\|///      Hoffe, geholfen zu haben.
       ( ô ô )      Grüße, André aus G in T  
  ooO-(_)-Ooo    (Excel 97-2019+365)
Top
#6
Hallo,

unter der Voraussetzung, dass die Kontrollkästchen nicht in andere Zellen ragen, könnte es so gehen:

Code:
Public Sub Kontrollkästchen_Check()
Dim CB_active As Integer
Dim CB_passive As Integer
Dim CB_all As Integer
Dim CB As CheckBox
Dim Beginn_liste_Spalte As Integer
Dim Beginn_liste_Zeile As Integer
Dim spalte As Integer, spalte2 As Integer
Dim zeile As Integer
'--> Beginn der Liste der leeren Boxen festlegen
Beginn_liste_Spalte = 1
Beginn_liste_Zeile = 23
spalte = Beginn_liste_Spalte + 1
spalte2 = Beginn_liste_Spalte + 1
Rows(24).ClearContents
Rows(23).ClearContents
'--> Anzahl Boxen berechnen
For Each CB In ActiveSheet.CheckBoxes
'CB.Select
   CB_all = CB_all + 1
   If CB.Value = 1 Then
     CB_active = CB_active + 1
     Cells(23, spalte) = 1
   Else
     CB_passive = CB_passive + 1
     Cells(23, spalte) = 0
   End If

   If CB.Value <> 1 Then
   CB.Select
     Cells(24, spalte2) = CB.TopLeftCell.Row + (CB.TopLeftCell.Column - 1) * 10
     spalte2 = spalte2 + 1
   End If
   spalte = spalte + 1
Next
ActiveSheet.Range("E" & 15).Value = CB_all
ActiveSheet.Range("E" & 16).Value = CB_active
ActiveSheet.Range("E" & 17).Value = CB_passive

End Sub
Gruß Atilla
Top
#7
(07.04.2015, 21:49)atilla schrieb: unter der Voraussetzung, dass die Kontrollkästchen nicht in andere Zellen ragen, könnte es so gehen:

Hallo zusammen,

Danke schauan und attila für eure Hilfe. :18:

Ich kann eure Vorschläge aber leider erst am Wochenende ausprobieren (bin selbständig und muss Geld verdienen).
Zu euren Fragen - die Kästchen habe ich versucht, per d&d auf die linke Seite des betreffenden Feldes zu ziehen.
Im Feld selbst steht auf der rechten Seite noch eine Zahl, die angibt, wie oft das betreffende Teil vorhanden ist.
Dies spielt aber für mein Problem hier keine Rolle, deshalb habe ich sie wegen der Übersichtlichkeit herausgelöscht.
Ich habe zur besseren Erklärung die Testdatei noch mit Erklärungen betreffs des Wertes jedes Kästchens versehen.

.xlsm   Test2.xlsm (Größe: 22,42 KB / Downloads: 2)

Wichtig ist auch:
Das von mir verwendete Script zum Bestimmen der passiven Kästchen sucht von links oben nach rechts unten.
Dadurch sucht es aber nicht in der Reihenfolge der Werte der Kästchen (ist blöde zu beschreiben!).
Also angenommen, die 5 Kästchen der oberen zwei Zeilen wären passiv, dann würden die gefundenen Werte in der Reihenfolge lauten:
(ganz oben links- das Feld mit dem Wert 00 hat kein Kästchen, denn Teil00 gibt es nicht)
10/20/01/11/21
Die Werte der passiven Kästchen sollten aber am Ende sortiert vorliegen, also:
01/10/11/20/21

Am Ende werde ich die gefundenen Werte der passiven Kästchen noch formatieren, also in eine Matrix mit 10 Spalten und entsprechend vielen Zeilen schreiben, damit man eine übersichtliche Liste mit den Fehlteilen in die Hand bekommt.
Hoffentlich habe ich das alles so erklärt, dass es verständlich ist.
Ich bitte um Nachsicht, aber ich bin sowohl in VB, als auch hier im Forum noch ein Neuling.

Ich melde mich wieder, sowie ich dazugekommen bin, eure Vorschläge auszuprobieren.
Wenn das Script mal fertig ist, werde ich es hier posten.
Vielleicht kann jemand außer mir damit etwas anfangen.

Viele Grüße
Bödefeld
[-] Folgende(r) 1 Nutzer sagt Danke an Bödefeld für diesen Beitrag:
  • Rabe
Top
#8
Hallo,

es hat mir doch keine Ruhe gelassen, habe eure Vorschläge ausprobiert.
Der letzte Vorschlag von Attila kommt der Sache schon näher, nur die ausgegebenen Werte stimmen noch nicht.
Ich habe seinen Änderungsvorschlag hochgeladen:


.xlsm   Test3.xlsm (Größe: 22,32 KB / Downloads: 4)

Noch einmal zur Erklärung:
Die linke obere Ecke der Tabelle beginnt immer an der gleichen Stelle.
Sie ist nur von Tabellenblatt zu Tabellenblatt unterschiedlich breit.
Die Kontrollkästchen der Tabelle stellen eine Gruppe von Teilen dar.
Die Tabelle hat immer nur 10 Zeilen und entsprechend viele Spalten, abhängig davon,  wie viele Teile zur Tabelle gehören.
Neben der Kästchen-Gruppe befinden sich (hellblaue) Felder, waagerecht oberhalb (für die "Einer-Teilnummer" - 0 -> 9)
und senkrecht links (für die "Zehner-Teilnummer" - 10 -> ...), mit denen man durch Addition beider Werte die Nr. eines bestimmten Teils ermitteln kann.

Aktivieren wir mal alle Kästchen außer dem oberen unter der "10".
Dieses Kästchen steht unter der "10" und rechts neben der "0" (in den hellblauen Feldern). Es würde sich also um das Teil mit der Nummer 10 (10+0) handeln.
Ausgegeben wird aber "13".
Das gleiche passiert auch bei den anderen Kästchen. Für Teil-Nr. "16" wird "18" ausgegeben, usw..
Die Differenz zwischen der ausgegebenen und der tatsächlichen Teil-Nummer ist also nicht bei allen Teilen gleich.
Sonst hätte ich das Problem einfach durch Subtraktion von "3" gelöst.

Außerdem passiert im Beispiel von Attila noch was komisches.
Beim Anklicken (Deaktivieren) eines aktivierten Kästchens schaltet Excel in den Bearbeitungsmode des Kontrollkästchens um und legt um das betreffende Kästchen den Bearbeitungsrahmen.
Da muss man jedes Mal mit ESC erst den Rahmen löschen.

Dank noch einmal an alle, die mir bisher geholfen haben.
Vielleicht bekommen wir das Problem doch noch in den Griff.

Grüße
Bödefeld

(07.04.2015, 21:49)atilla schrieb: unter der Voraussetzung, dass die Kontrollkästchen nicht in andere Zellen ragen, könnte es so gehen:
Top
#9
Hallo,

leider kann man mit Deinen eingestellten Mappen nicht vernünftig testen, da die Kästchen immer über mehrere Zellen gehen.

Wenn Du die Kästchen vernünftig in die Zellen legst, dazu kannst Du Andres Code nutzen, dann geht mein Code mit einer kleinen Anpassung:

Code:
Public Sub Kontrollkästchen_Check()
Dim i As Long
Dim CB_active As Integer
Dim CB_passive As Integer
Dim CB_all As Integer
Dim CB As CheckBox
Dim Beginn_liste_Spalte As Integer
Dim Beginn_liste_Zeile As Integer
Dim spalte As Integer, spalte2 As Integer
Dim zeile As Integer
Dim feld
'--&gt; Beginn der Liste der leeren Boxen festlegen
Beginn_liste_Spalte = 1
Beginn_liste_Zeile = 23
spalte = Beginn_liste_Spalte + 1
spalte2 = Beginn_liste_Spalte + 1
Rows(24).ClearContents
Rows(23).ClearContents
'--&gt; Anzahl Boxen berechnen
For Each CB In ActiveSheet.CheckBoxes
   CB_all = CB_all + 1
   If CB.Value = 1 Then
     CB_active = CB_active + 1
     Cells(23, spalte) = 1
   Else
     CB_passive = CB_passive + 1
     Cells(23, spalte) = 0
   End If

   If CB.Value <> 1 Then
     Cells(24, spalte2) = Cells(CB.TopLeftCell.Row, 1) + Cells(2, CB.TopLeftCell.Column + 1)
     spalte2 = spalte2 + 1
   End If
   spalte = spalte + 1
Next
If spalte2 > 3 Then
 feld = Range(Cells(24, 2), Cells(24, spalte2 - 1))
 For i = 1 To spalte2 - 2
   Cells(24, i + 1) = Application.Small(feld, i)
 Next i
End If
ActiveSheet.Range("E" & 15).Value = CB_all

Nachtrag: Sortierung für Spalte 24 nachträglich eingearbeitet.


Dass die Kästchen ausgewählt wurden, hatte ich zu Testzwecken eingebaut. Die Zeilen   CB.Select  mussten raus.
Gruß Atilla
Top
#10
Hallo Attila,

das die Kästchen über mehrere Zellen gehen sollen, ist mir nicht klar.
Verzeih bitte meine Ahnungslosigkeit, aber ich kann in meiner Tabelle nur ein Kästchen pro Zelle sehen.
Du kannst das hier

.pdf   Test.pdf (Größe: 69,32 KB / Downloads: 7)
leicht mal überprüfen.

Oder was mache ich falsch?

Grüße
Bödefeld
Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste