Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1692to1696
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

Listbox durchsuchen und Eintrag ergänzen

Listbox durchsuchen und Eintrag ergänzen
14.05.2019 15:14:44
Tim
Moin zusammen,
ich habe Dank des Forums bereits eine gut funktionierende Lösung bekommen, für die ich eine Erweiterung benötige.Leider reichen meine Fähigkeiten nicht für eine Lösung.
Ich habe verschiedene Comboboxen, deren Inhalt in einer Listbox gesucht und markiert werden soll, das funktioniert perfekt. Jetzt möchte ich gern erreichen, dass mir zu den Treffern eine Menge in die Spalte 3 der Listbox schreibt.
Meine Idee dazu sieht wie folgt aus und funktioniert leider nicht:

Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With UserForm1.ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 6   'lngIndex entspricht der Nummer im TxtBox Namen
If UserForm1.Controls("ComboBox" & lngIndex)  "" Then
Select Case lngIndex
Case 1, 3, 4  'Prüft Inhalt aus ComboBox 1,3,4 in ListBox Spalte 1
If .List(lngZeile) Like "*" & UserForm1.Controls("ComboBox" & lngIndex)  _
& "*" _
Then markieren = True
.List(lngZeile,3) = Userform1.Combobox6
End Select
End If
If markieren = True Then Exit For   'damit ist der Code ggf. schneller
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
14.05.2019 15:38:38
Matthias
Moin!
Probiere es mal so. Ich weiß jetzt nicht genau, was bei dir nicht funktioniert hat. MIt dem Code hier, wird die Zeile markiert und der Wert der Combo6 (die sollte es auch geben) eingetragen. Du muss dafür aber in der CB6 auch was auswählen. In der Else SChleife könntest du den Eintrag in der Spalte wieder löschen. Falls es nicht klappt, bitte mal noch erklären, was nicht geht.
Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With UserForm1.ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 6   'lngIndex entspricht der Nummer im TxtBox Namen
If UserForm1.Controls("ComboBox" & lngIndex)  "" Then
Select Case lngIndex
Case 1, 3, 4  'Prüft Inhalt aus ComboBox 1,3,4 in ListBox Spalte 1
If .List(lngZeile) Like "*" & UserForm1.Controls("ComboBox" & lngIndex)  _
& "*" Then
markieren = True
.List(lngZeile, 3) = UserForm1.ComboBox6
Else
'hier könnte man ihn auch löschen lassen
'.List(lngZeile, 3) = ""
End If
End Select
End If
If markieren = True Then Exit For   'damit ist der Code ggf. schneller
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub
VG
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
14.05.2019 16:44:22
Tim
Hi Matthias,
schön das du dir meine Anfrage angenommen hast. Die else Funktion leert nicht komplett, sondern lässt immer das erste Zeichen in der Spalte stehen.
AW: Listbox durchsuchen und Eintrag ergänzen
14.05.2019 19:14:37
Matthias
Moin!
Ich lasse es mal ungelöst.
Hast du da noch einen anderen Code, der mit drüber läuft? Der else Zweig ersetzt den EIntrag in der LIste mit leer. Da bleibt kein Zeichen zurück. Vllt. trägt da ja ein andere Code was ein (warum auch immer). Habe es mal in einer Testdatei geprüft. Bei mir geht der TExt komplett raus. Poste sonst mal, wie du ihn eingebaut hast!
VG
AW: Listbox durchsuchen und Eintrag ergänzen
15.05.2019 08:32:00
Tim
Guten Morgen Matthias,
ich habe dir meine Bsp. Datei fertig gemacht und glaube zu wissen woran es liegen könnte. Dein Vorangegangener Code bezog sich auf Textboxen (so hatte ich auch im Forum angefragt). Ich habe dann mit meinen Fähigkeiten einen Teil der Textboxen durch Comboboxen ersetzt, damit bekam ich jedoch eine Fehlermeldung. Meine Idee war, deinen Code auf UserForm1.Controls("ComboBox" & lngIndex) "" umzustellen und die Textboxen im Name als Comboboxen zu bezeichnen.
Funktioniert auch soweit jedoch bleibt beim leeren einer Textbox, in der Listbox die Erste Zahl stehen.
https://www.herber.de/bbs/user/129785.xlsm
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
15.05.2019 09:31:31
Matthias
MOin!
Habe dummerweise unter meinem Beitrag geantwortet. Bitte dort schauen.
VG
AW: Listbox durchsuchen und Eintrag ergänzen
15.05.2019 09:30:45
Matthias
Moin!
Habe mir das mla angeschaut. Auch wenn das Programmiertechnisch so enfacher ist, würde ich davon abraten eine TextBox mit ComboBox zu benennen. Die haben teils unterschiedliche Eigenschaften (bspw. listindex). Und falls du später mal was zusätzliches bastelst und diese Eigenschaft abfragst könnte ein Fehler auftreten, wenn du nicht dran denkst. Das aber nur als Tipp - wenn du das immer im Auge behälst, spricht natürlich nichts dagegen. :-)
So nun zu deinem Problem. Wenn die CB6 leer ist, springt der Code zum Ändern auch nicht an - If Prüfung in der For Schleife über die Combo Indexe. Ändere mal die If Zeile so. Dann würde bei der CB6 die select Case Prüfung aufgerufen und der Wert gelöscht.
If UserForm1.Controls("ComboBox" & lngIndex)  "" Or lngIndex = 6 Then

Da somit immer die CB6 geprüft wird, müssen wir dann dort noch schauen, ob der Wert leer ist. Beim Case 6 also das so ändern:
If .List(lngZeile) Like "*" & "entnehmen" & "*" And UserForm1.ComboBox6  "" Then

Das ist jetzt für CB6 doppelt gemoppelt. Ansonsten müsstest du die Prüfung der Cb6 aber aus der for SChleife herausnehmen. Sollte es noch mehr solche Fälle wie Cb6 geben, wäre das dann auch das beste. Für die könnte man ja eine eigene for Schleife basteln. Bei der einen Box kann man glaubeich damit leben. Schreibe dir im richtigen Code ggf. noch einen Kommentar dazu, damit du später weißt warum und wiso.
Nimm dann aber bitte mal die Zeile hier
If markieren = True Then Exit For 

wieder raus. Die sollte dazu dienen, dass man nicht alle Combox prüfen muss, wenn beim 1. schon feststeht, dass die Zeile markiert wird. Damit würgst du aber CB6 ab, die ja ggf. noch was ergänzt.
VG
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
15.05.2019 13:19:56
Tim
Hi Matthias,
vielen Dank für das Ganze Hintergrundwissen dazu!
hier der Code wie ich Ihn jetzt angepasst habe:
Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With UserForm1.ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 6   'lngIndex entspricht der Nummer im TxtBox Namen
If UserForm1.Controls("ComboBox" & lngIndex)  "" Or lngIndex = 5 Or lngIndex = 6  _
Then
Select Case lngIndex
Case 1, 3, 4  'Prüft Inhalt aus ComboBox 1,3,4 in ListBox Spalte 1
If .List(lngZeile) Like "*" & UserForm1.Controls("ComboBox" & lngIndex)  _
& "*" _
Then markieren = True
Case 5      'Prüfung in Spalte 1 = wenn Textbox gefüllt, dann such  _
sortieren und markiere diesen Eintrag
If .List(lngZeile) Like "*" & "sortieren" & "*" And UserForm1.ComboBox5  "" _
Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox5
Else
.List(lngZeile, 2) = ""
End If
Case 2      'Prüft Inhalt aus ComboBox 2 in ListBox Spalte 3
If .List(lngZeile, 3) Like "*" & UserForm1.Controls("ComboBox" &  _
lngIndex) & "*" _
Then markieren = True
Case 6      'Prüfung in Spalte 1 = wenn Textbox gefüllt, dann such  _
entnehmen und markiere diesen Eintrag
If .List(lngZeile) Like "*" & "entnehmen" & "*" And UserForm1.ComboBox6  "" _
Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox6
Else
.List(lngZeile, 2) = ""
End If
End Select
End If
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub
Für die CB6 funktioniert es, jedoch nicht für die CB5.
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
15.05.2019 14:41:24
Matthias
Moin!
Das Problem bei dir war, dass die CB5 was einträgt. Dann kommt die CB6, stellt nichts fest und löscht das Feld wieder.
Das ist der Fall, denn ich vorhin meinte.
Bei einer zweite Box wird der Code nur noch verstückelter. Sollten jetzt noch mehr Boxen dazu kommen, wird es total unübersichtlich (angefangen schon bei der if Zeile, wo du die ganzen Ausnahmen einbauen musst.) Da würde ich die Schleige splitten. Damit kannst du besser die unterschiedlichen Bedingungen anpassen. Theoertisch könntest du damit auch die uspr. Bezeichnung der Elemente (Textbox :-) ) wieder nutzen, da du nun eine Schleife für die CB und eine für die TB hast. Das hätte auch den Vorteil, dass du bei weitern Boxen nicht alle Indizes anpassen musst (im Code und bei den Boxen), damit du nacheinander laufen bzw. in der richtigen Reihenfolge geprüft werden.
Habe das jetzt mal geändert. In der Schleife der CB darf jetzt auch der Abbruch beim markieren wieder rein. Das spart unnötige Prüfungen und wir überspringen kein Eintragen. Für die Text/Comboboxen sieht die Schleife ähnlich aus. Da muss nun aber ein Exit for rein. Ansonsten überschreiben sich die CB wieder gegenseitig. Ich gehe auch mal davon aus, dass CB5 und CB6 nie! zu gleichen Zeit was eintragen können. Wenn doch, müsste man das was anpassen. Hier nun der Code:
Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
With UserForm1.ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
For lngIndex = 1 To 4   'lngIndex entspricht der Nummer im TxtBox Namen
If UserForm1.Controls("ComboBox" & lngIndex)  "" Then
Select Case lngIndex
Case 1, 3, 4  'Prüft Inhalt aus ComboBox 1,3,4 in ListBox Spalte 1
If .List(lngZeile) Like "*" & UserForm1.Controls("ComboBox" & lngIndex)  _
& "*" _
Then markieren = True
Case 2      'Prüft Inhalt aus ComboBox 2 in ListBox Spalte 3
If .List(lngZeile, 3) Like "*" & UserForm1.Controls("ComboBox" &  _
lngIndex) & "*" _
Then markieren = True
End Select
End If
If markieren Then Exit For
Next
For lngIndex = 5 To 6   'die extra da es Eintragungen gibt
Select Case lngIndex
Case 5
If .List(lngZeile) Like "*" & "sortieren" & "*" And UserForm1.ComboBox5  " _
" Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox5
Exit For
Else
.List(lngZeile, 2) = ""
End If
Case 6
If .List(lngZeile) Like "*" & "entnehmen" & "*" And UserForm1.ComboBox6  " _
" Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox6
Exit For
Else
.List(lngZeile, 2) = ""
End If
End Select
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub

VG
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
16.05.2019 16:31:27
Tim
Hallo Matthias,
ich bin jetzt erst dazu gekommen deine Umsetzung zu testen, funktioniert!!!
Die Werte aus CB5+6 (die Textboxen sind) könnten in Zukunft auch andere Einträge aus CB betreffen.
Bsp.: Wert aus CB5 soll auch der Listboxauswahl für CB1 zugeordnet werden, ist diese Funktion machbar?
AW: Listbox durchsuchen und Eintrag ergänzen
16.05.2019 18:02:03
Matthias
Moin!
Grundsätzlich ist alles möglich. :-) Verstehe aber grad nicht, was du meinst. Du willst den Wert "sortieren" in der CB1 mit auswählen lassen?! Soll über die CB1 Prüfung dann auch wieder die Zahl eingetragen werden? Fällt die CB5 dann weg oder fällt nur der Cahnge dazu weg? Bitte nochmal genauer erklären, was geschehen soll und bei welchen Elementen.
VG
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
16.05.2019 20:12:05
Tim
Hier etwas mehr zum Hintergrund, vielleicht erklärt es sich dadurch besser. Die Listbox beinhaltet Arbeitsabläufe zu denen es in einer weiteren Spalte Zeiten gibt. Die Comboboxen beinhalten vorgegeben Antworten, um durch Fragen den richtigen Arbeitsablauf markieren zu können. Die Textboxen funktionieren ähnlich wie die Comboboxen, füllt man sie mit einem Zahlenwert, so bestätigt das eine bestimmten Arbeitsablauf und multipliziert den Zeitwert zu dem Arbeitsablauf.
Bsp.: erste Frage in Label "was soll gemacht werden?" Antwort CB1 "Produkte einlagern"
zweite Frage in Label "wie viele Seriennummern besitzen die Produkte?" Antwort TB1 "100"
Daraus ergibt sich, dass man 100x Produkte einlagern und 100x Seriennummern scannen soll.
Für die Listbox soll jetzt für den Eintrag aus Antwort 1 der Zeitwert die Anzahl 100 bekommen und für Antwort 2 genauso.
Die Zuordnung der Anzahl muss nicht jedem Eintrag der Listbox entsprechen, kann aber auch mehreren entsprechen.
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
17.05.2019 14:12:15
Matthias
Moin!
Ehrlich gesagt blicke ich noch nicht so ganz durch. Zudem ergeben sich noch weitere Fragen (insb. um den Code allgemeingültig zu halten bzw. anpassbar zu machen). Schließen sich die einzelnen CB aus oder können die auch mehrfach vorkommen (also CB1 und CB2 ergeben einen Treffer)? Haben die dann immer Bezug auf die selbe TB?
So wie ich deinen Beitrag verstanden habe, habe ich mal den Code angepasst. Dabei werden über eine Hilfsvariable noch vermerkt, ob die CB1 den Eintrag in Spalte 2 vornimmt. Das wird dannbeim Löschen in der Cb5 / 6 berücksichtigt. Einfach mal schauen.
Sub aktualisieren()
Dim lngZeile As Long
Dim lngIndex As Long
Dim markieren As Boolean
Dim erfasst As Boolean
With UserForm1.ListBox1
For lngZeile = 0 To .ListCount - 1
markieren = False
erfasst = False
For lngIndex = 1 To 4   'lngIndex entspricht der Nummer im TxtBox Namen
If UserForm1.Controls("ComboBox" & lngIndex)  "" Then
Select Case lngIndex
Case 1, 3, 4  'Prüft Inhalt aus ComboBox 1,3,4 in ListBox Spalte 1
If .List(lngZeile) Like "*" & UserForm1.Controls("ComboBox" & lngIndex)  _
& "*" Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox5
erfasst = True
End If
Case 2      'Prüft Inhalt aus ComboBox 2 in ListBox Spalte 3
If .List(lngZeile, 3) Like "*" & UserForm1.Controls("ComboBox" &  _
lngIndex) & "*" _
Then markieren = True
End Select
End If
If markieren Then Exit For
Next
For lngIndex = 5 To 6   'die extra da es Eintragungen gibt
Select Case lngIndex
Case 5
If .List(lngZeile) Like "*" & "sortieren" & "*" And UserForm1.ComboBox5  " _
" Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox5
Exit For
Else
If Not erfasst Then .List(lngZeile, 2) = ""
End If
Case 6
If .List(lngZeile) Like "*" & "entnehmen" & "*" And UserForm1.ComboBox6  " _
" Then
markieren = True
.List(lngZeile, 2) = UserForm1.ComboBox6
Exit For
Else
If Not erfasst Then .List(lngZeile, 2) = ""
End If
End Select
Next
If markieren = True Then
.Selected(lngZeile) = True
Else
.Selected(lngZeile) = False
End If
Next lngZeile
End With
End Sub
VG
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
20.05.2019 08:01:45
Tim
Guten Morgen Matthias,
deine Anpassung ist genau das was ich wollte. Bei den TB zu CB gibt es entweder eine 1 zu 1 oder eine 1 zu n Zuordnung, das variiert. Um das Ganze abzuschließen benötige ich zum Schluss die Summe der Werte aus den Spalten. Dazu habe ich in deinem Code folgendes gemacht, jedoch multipliziert er nur einen Eintrag und nicht alle selected
If markieren = True Then
.Selected(lngZeile) = True
UserForm1.Label8.Caption = .List(lngZeile, 2) * .List(lngZeile, 3)
Else
.Selected(lngZeile) = False
UserForm1.Label8.Caption =""
End If
Next lngZeile
Anzeige
AW: Listbox durchsuchen und Eintrag ergänzen
20.05.2019 20:52:10
Matthias
Moin!
Also mache das mal lieber so. Ansonsten löscht du bei einem nicht selektierten Eintrag wieder alles. Zudem fehlte die Summe der Einzelnen Werte. Da die Woche seit Threadstart bald vorbei ist, ggf. einen neuen aufmachen. Dann aber auf den hier verweisen.
If markieren = True Then
.Selected(lngZeile) = True
UserForm1.Label8.Caption = Val(UserForm1.Label8.Caption) + Val(.List(lngZeile, 2)) * _
Val(.List(lngZeile, 3))
Else
.Selected(lngZeile) = False
End If
VG

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige