CheckBox zur Laufzeit einlesen

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: CheckBox zur Laufzeit einlesen
von: Dirk C.
Geschrieben am: 23.09.2015 13:21:27

Hallo xlGurus,
Bei Änderungen in Spalte H öffnet sich ein UserForm mit CheckBoxen.
CheckBox.Caption wird über eine Liste mit dem Namen "Suche" gesteuert.
Lässt sich dieser Name auch im VBA-Code benutzen (siehe: Private Sub UserForm_Initialize ) ?
Die CheckBox.Caption soll als Suchbegriff für TeilString in Spalte K genutzt werden.
Gesucht wird allerdings nicht in der gesamten Spalte K, sondern nur in der jeweiligen Zeile.
Soweit habe ich mich schon laienhaft vorgearbeitet - das "Einlesen" in die CheckBoxen scheint zu funktionieren.
Doch nun komme ich absolut nicht weiter. Selbst nach stundenlanger Recherche hier im Archiv drehe ich mich nur noch im Kreise.
Aber vllt. mache ich schon hier gravierende Fehler ?
Mein Ziel ist:
Durch An- od. Abwahl einer CheckBox soll der hinterlegte Begriff in K erscheinen od. verschwinden.
Jeder Begriff darf nach der Bearbeitung nur noch einmal vorkommen, wobei die Reihenfolge in der Zelle nicht interessant ist.
Ich freue mich auf Eure Hilfe.
Gruss
Dirk
P.S.: aktueller Bearbeitungsstand
https://www.herber.de/bbs/user/100339.xlsm

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: daniel
Geschrieben am: 23.09.2015 13:56:19
Hi
der gravierenste Fehler ist, dass du hier einen unpassenden Steuerelementtyp verwendest.
Nimm statt der vielen Checkboxen EINE Listbox im Multiselekt-Modus und alles wird viel einfacher und kürzer
Gruß Daniel

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Dirk C.
Geschrieben am: 23.09.2015 14:10:00
Hallo Daniel,
bin leider nicht so fit in Excel.
Hättest du dazu vllt. ein kleines Beispiel in Anlehnung an die Mappenstruktur ?
Listbox im Multiselekt-Modus klingt interessant, aber auch kompliziert...
Anscheinend habe ich mal wieder den falschen Ansatz verfolgt u. mich verrannt.
Vielen Dank also schonmal für deinen fachkundigen Tipp.
Gruss
Dirk

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: daniel
Geschrieben am: 23.09.2015 14:47:38
Hi
lösche in der Userform alle Checkboxen und erstelle stattdessen eine Listbox (Listbox1)
mache für diese Listbox folgende Einstellungen in der Eigenschaftsliste:
- RowSource: Suche (das ist der Name, den du für den Quellzellbereich verwendet hast)
- MultiSelect: 1-fmMultiselectMulti oder 2-fmMultiSelectExtended
- ListStyle: 1-fmListStyleOption (optional, dann sieht die Listbox aus wie Checkboxen)
schreibe folgenden Code ins Modul der Listbox (alles andere kannst du löschen)

Option Explicit
Private Sub CommandButton1_Click()
Dim txt As String
Dim i As Long
For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) Then txt = txt & ListBox1.List(i)
Next
Cells(ActiveCell.Row, "K").Value = txt
Unload Me
End Sub
Private Sub UserForm_Initialize()
Dim txt As String
Dim i As Long
txt = Cells(ActiveCell.Row, "K").Value
For i = 0 To ListBox1.ListCount - 1
    ListBox1.Selected(i) = txt Like "*" & ListBox1.List(i) & "*"
Next
End Sub
wenn die Listbox aktiviert wird, dann überprüft der Code welche Elemente der Listbox in der Zelle in Spalte K vorkommen und setzt entsprechend die Häkchen.
bei KLick auf den Button wird dann der Zelltext der zelle in Spalte K entsprechend der gesetzen Häkchen geändert.
Gruß Daniel

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Dirk C.
Geschrieben am: 23.09.2015 15:27:35
Hallo Daniel,
jetzt bin ich total deprimiert.
Frag' nicht, wieviele Stunden ich schon über diesem Problem grübele...
Und nun kommst Du und schüttelst so im Vorbeigehen eine Lösung aus dem Ärmel, die mir besser gefällt als ich es mir vorstellte.
Einfach PERFEKT !
Ich danke Dir vielmals, auch für die Hilfestellung zum "Einbau" in meine Mappe.
Wenn Du kein xl-Dozent bist, dann solltest Du mal über einen Berufswechsel nachdenken. ;-)
Ich wünsche Dir u. allen anderen hier ein schönes Wochen-Bergfest.
Bis bald mal wieder.
Dirk

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Dirk C.
Geschrieben am: 24.09.2015 15:24:21
Hallo nochmal,
nun tut sich allerdings ein neues Problem auf.
In der Spalte K können auch Begriffe stehen, die nicht in der Namensliste "Suche" vorkommen.
Jetzt werden diese nach Änderungen in der ListBox gelöscht, was nicht passieren passieren darf...
Kann mir nochmal jemand helfen ?
Gruss
Dirk

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Daniel
Geschrieben am: 24.09.2015 16:01:16
Hi
vielleicht so (ohne das jetzt nochmal zu testen):

Private Sub CommandButton1_Click()
Dim txt As String
Dim i As Long
txt = Cells(ActiveCell.Row, "K").Value 
For i = 0 To ListBox1.ListCount - 1
    If ListBox1.Selected(i) Then 
        if Instr(txt, Listbox1).list(i)) = 0 then txt = txt & ListBox1.List(i)
    else
        txt = replace(txt, Listbox1.List(i), "")
    end if
Next
Cells(ActiveCell.Row, "K").Value = txt
Unload Me
End Sub
Gruß Daniel

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Dirk C.
Geschrieben am: 24.09.2015 16:26:39
Hallo Daniel,
leider kann ich diesen Code nicht einfügen:
if Instr(txt, Listbox1).list(i)) = 0 then txt = txt & ListBox1.List(i)
wird rot markiert mit der Fehlermeldung: "Erwartet Then oder GoTo"
Schaust du bitte nochmal drauf ?
Vielen Dank.
Gruss
Dirk

Bild

Betrifft: AW: CheckBox zur Laufzeit einlesen
von: Daniel
Geschrieben am: 24.09.2015 22:21:09
Hi
da hast du ein Klammer-zu zuviel drin.
Gruss Daniel

Bild

Betrifft: ListBox-Multiselect
von: Dirk C.
Geschrieben am: 25.09.2015 02:54:45
Hallo Daniel,
manchmal sehe ich wohl echt den Wald vor lauter Bäumen nicht - das hätte ich selber merken müssen...
Nun läuft's rund - Dank Deiner Hilfe.
Abschließend noch eine Frage:
In der Liste "Suche", die der ListBox1 zugrunde liegt (Source), können auch leere Zellen sein. Diese bewirken dann in der ListBox ein angehaktes Kontrollkästchen ohne jeglichen Text dahinter.
Wie kann man diese Leerzeilen unterdrücken?
Gruss
Dirk
zum Testen: Halbfinal-Stand

Bild

Betrifft: AW: ListBox-Multiselect
von: Daniel
Geschrieben am: 25.09.2015 13:05:32
Hi
dann musst du die Eigenschaft RowSource weglassen und eine Schleife über die entsprechenden Zellen programmieren, welche im Initialize-Event die Werte per .AddItem zur Listbox hinzufügt, dh in etwa so

for each Zelle in Sheets("Quelle").range("AI6:AI14)
    if Zelle.Value <> "" then Listbox1.AddItem Zelle.Value
next
gruß Daniel

Bild

Betrifft: AW: ListBox-Multiselect
von: Dirk C.
Geschrieben am: 25.09.2015 19:20:40
Hallo Daniel,
natürlich ist Dein Tipp mal wieder total richtig, aber ich stosse da an meine Grenzen.
Damit sind zwar die Leerzeilen weg, doch das zieht nun auch einen Rattenschwanz an Änderungen nach sich, die ich allein nicht gestemmt kriege...
(Einlesen der Werte aus K - fehlende Haken, Vergleich mit K beim Einlesen u. vor dem Zurückschreiben etc.)
Somit würde ich wieder ganz am Anfang stehen.
Da lasse ich mal lieber die Finger von u. lebe lieber mit diesem kl. Schönheitsfehler.
Diese Leerzeilen lassen sich optisch auch als "Trennlinie/Abgrenzung" für unterschiedliche "Wertegruppen" benutzen.
Abschließend also besten Dank für Deine Hilfe u. Engelsgeduld bei meinen Nachfragen !
Dir u. allen anderen hier im Forum wünsche ich ein schönes WE.
MfG
Dirk

Bild

Betrifft: oT
von: Dirk C.
Geschrieben am: 24.09.2015 18:05:00
sorry, noch offen...

 Bild

Beiträge aus den Excel-Beispielen zum Thema "CheckBox zur Laufzeit einlesen"