Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1840to1844
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
Userform Listbox mit Comboboxen filtern
06.08.2021 15:26:34
Thomas
Hallo liebe Forenmitglieder,
ich habe eine Ausgangstabelle (Tabelle2) als Datenbasis und habe dann in einem Userform die Auflistung dieser Daten in einer Listbox vorgenommen.
Zusätzlich habe ich noch eine Tabelle mit Kategorievorgaben (Tabelle3). Diese Auswahlmöglichkeiten aus Tabelle3 werden in die ComboBoxen auf dem Userform geladen und sollen die Möglichkeit bieten, die Daten in der Listbox entsprechend zu filtern.
Hier steckt genau mein Problem.
Ziel: Wird ein/mehrere Eintrag in einer/mehrer Comboboxen ausgewählt, sollen die Einträge in der listbox entsprechend angezeigt werden. Wird der Eintrag aus der ComboBox gelöscht, sollen wieder alle angezeigt werden.

Do While Trim(CStr(Tabelle2.Cells(lZeile, 27).Value))  ""
If ComboBox1.Value = Tabelle2.Cells(lZeile, 25).Value Then
ListBox1.AddItem Trim(CStr(Tabelle2.Cells(lZeile, 27).Value))
ListBox1.List(ListBox1.ListCount - 1, 1) = Trim(CStr(Tabelle2.Cells(lZeile, 25).Value))
ListBox1.List(ListBox1.ListCount - 1, 2) = Trim(CStr(Tabelle2.Cells(lZeile, 24).Value))
ListBox1.List(ListBox1.ListCount - 1, 3) = Trim(CStr(Tabelle2.Cells(lZeile, 23).Value))
ListBox1.List(ListBox1.ListCount - 1, 4) = Trim(CStr(Tabelle2.Cells(lZeile, 2).Value))
ListBox1.List(ListBox1.ListCount - 1, 5) = Trim(CStr(Tabelle2.Cells(lZeile, 26).Value))
lZeile = lZeile + 1
End If
Loop
Eine Idee mit If konnte ich nicht umsetzen, da sie sich nur auf eine Combobox bezogen hätte und das entfernen eines Eintrags nicht berücksichtigt worden wäre.
Außerdem wurde leider das userform nicht mehr geladen.
https://www.herber.de/bbs/user/147490.xlsm
Ich habe schon eine Menge gegoogelt, aber keine Lösungsansätze bei mehreren Kriterien gefunden. Solltet ihr mir einen Hinweis zu einem Lösungsansatz geben können, wäre das total klasse!
Vielen lieben dank im Voraus, an jeden der sich die Zeit nimmt sich meinem Problem anzunehmen und mir auf den Lösungsweg hilft!
Viele Grüße
Thomas

4
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Userform Listbox mit Comboboxen filtern
09.08.2021 08:49:09
Thomas
Hallo Nepumuk,
vielen vielen lieben Dank, das du dir die Zeit genommen hast und dir nicht nur mein Problem angesehen, sondern die komplette Lösung dargestellt hast.
Ich konnte dies in meine Tabelle übernehmen und Sie funktioniert nun fantastisch!
Leider bin ich in VBA nicht wirklich gut, versuche aber immer etwas dazu zu lernen. Deshalb habe ich mir am Wochenende Deinen Code geschnappt und laienhaft kommentiert. Ich versuche immer, wenn ich Hilfe erhalte, diese nachzuvollziehen und zu verstehen. Vielleicht hilft dies in diesem Fall auch anderen Nutzern, die nach ählichen Problemen suchen.
Bei einem Teil deines Codes habe ich leider nur ? im Kopf und nicht verstanden, wie dieser und was genau dieser bewirkt.
mblnNoEvent
Solltest du Lust haben, so fände ich es total toll, wenn du mich in dieser Frage noch aufschlauen kannst, dann denke ich, kann ich Deine Hilfe nachvollziehen und beim nächsten Mal selbst anwenden. :-)
https://www.herber.de/bbs/user/147514.xlsm
Hab nochmals vielen lieben Dank!
Viele Grüße
Thomas
Anzeige
AW: Userform Listbox mit Comboboxen filtern
09.08.2021 11:05:53
Nepumuk
Hallo Thomas,
ein Dictionary ist ähnlich einem Array mit zwei Spalten, wobei die erste Spalte eindeutige Schlüssel beinhaltet. In dieser Schleife:

For A = 1 To UBound(meAr) 'Von der ersten bis zur letzten Zeile im Array
oDic(meAr(A, 1)) = vbNullString 'Dem einmaligen Key im Dictionary wird ein leerer String zugewiesen
Next
Werden die Schlüssel angelegt oder, wenn er schon existiert, einfach überschrieben.
Der kommentierte Code:

Private Sub UserForm_Initialize()
Dim lZeile As Long
Dim dox As Long, DoLetzte As Long
Dim oDic As Object, meAr
Dim A As Long, S As Long
With ListBox1
.ColumnCount = 6 'Die Listbox 1 soll 6 Spalten haben
.ColumnWidths = "80;80;80;80;80;80" 'Festlegung der Spaltenbreiten
.Font.Size = 12 'Festlegung der Schriftgröße
End With
With Tabelle2 'Alle folgenden Sachen beziehen sich auf diese Tabelle
For lZeile = 2 To .Cells(.Rows.Count, 27).End(xlUp).Row 'Es wird in Zeile 2 gestartet, da in Zeile 1 Überschriften stehen und bis zur letzten gefüllten Zeile durchgeführt
If Trim$(.Cells(lZeile, 27).Text)  vbNullString Then 'Es werden alle Datensaätze übernommen, wenn keine leere Zelle vorliegt
ListBox1.AddItem Trim$(.Cells(lZeile, 27).Text) 'In der ersten Spalte der Listbox Spalte 27 von Tabelle2 darstellen
ListBox1.List(ListBox1.ListCount - 1, 1) = Trim$(.Cells(lZeile, 25).Text) 'In der zweiten Spalte der Listbox Spalte 25 von Tabelle2 darstellen
ListBox1.List(ListBox1.ListCount - 1, 2) = Trim$(.Cells(lZeile, 24).Text) 'In der dritten Spalte der Listbox Spalte 24 von Tabelle2 darstellen
ListBox1.List(ListBox1.ListCount - 1, 3) = Trim$(.Cells(lZeile, 23).Text) 'In der vierten Spalte der Listbox Spalte 23 von Tabelle2 darstellen
ListBox1.List(ListBox1.ListCount - 1, 4) = Trim$(.Cells(lZeile, 2).Text) 'In der fünften Spalte der Listbox Spalte 2 von Tabelle2 darstellen
ListBox1.List(ListBox1.ListCount - 1, 5) = Trim$(.Cells(lZeile, 26).Text) 'In der sechsten Spalte der Listbox Spalte 26 von Tabelle2 darstellen
End If
Next
End With
mavntValues = ListBox1.List 'Die Variable mavntValues entspricht den zuvor festgelegten Einträgen in der Listbox
Set oDic = CreateObject(Class:="Scripting.Dictionary") 'oDic wird als Dictionary definiert
For S = 1 To 4 'Schleife 1-4
With Worksheets("Tabelle3") ' Das folgende bezieht sich auf Tabelle 3
meAr = .Range(.Cells(2, S), .Cells(.Rows.Count, S).End(xlUp)).Value 'Das Dictionary wird befüllt mit den Werten aus der Spalte 1-4 und den Zeilen 2 bis letzte gefüllte
End With
For A = 1 To UBound(meAr) 'Von der ersten bis zur letzten Zeile im Array
oDic(meAr(A, 1)) = vbNullString 'Dem einmaligen Key im Dictionary wird ein leerer String zugewiesen
Next
Controls("ComboBox" & CStr(S)).List = oDic.Keys 'Die jeweilige Liste der ComboBox 1-4 entspricht den zuvor gemachten Einträgen
oDic.RemoveAll 'Alle Einträge im Dictionary löschen
Next
Set oDic = Nothing 'Objektvariable zurücksetzen
DoLetzte = Tabelle3.Cells(Rows.Count, 7).End(xlUp).Row 'DoLetzte Ist der letzte Wert in Spalte 7 auf Tabellenblatt 3
For dox = 2 To DoLetzte 'Führe ab Zeile 2 bis zur letzten gefüllten Zeile folgendes durch
ComboBox5.AddItem Tabelle3.Cells(dox, 7) 'Schreibe in die ComboBox5 den jeweiligen Eintrag der Zeile 2 und Folgende aus Spalte 7 Tabelle 3
Next
End Sub
Zur Variablen mblnNoEvent:
In der "Zurücksetzen-Routine" werden die Comboboxen geleert. Das löst aber die Change-Events der Comboboxen aus. Damit dabei die Filter-Routine nicht aufgerufen wird, setze ich die Variable vor den leeren der Comboboxen auf True und anschließen wieder auf False. In den Change-Events der Comboboxen frage ich die Variable ab, so dass nur wenn sie den Wert False hat die Filter-Routine aufgerufen wird. Jetzt klarer?
Gruß
Nepumuk
Anzeige
AW: Userform Listbox mit Comboboxen filtern
10.08.2021 23:54:49
Thomas
Hallo Nepumuk,
die Antwort war sehr hilfreich, große Klasse!
Ich hab wieder was dazu gelernt. Hab nochmals vielen Dank!
Viele Grüße
Thomas

39 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige