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
Inhaltsverzeichnis

mehrer Kriterien

mehrer Kriterien
17.08.2021 08:19:36
Thomas
Hallo excelfreunde,
mit dem folgenden Makro kann ich komfortabel meine Listbox spaltenweise durchsuchen.
' Achtung dies Option Compare Text gehört mit dazu
'https://www.ms-office-forum.net/forum/showthread.php?t=268236
'ransi
Dim arr
Dim i As Integer
Dim K As Long
Dim out As Variant
Dim L As Long
Dim dblStart As Double
With Application
.ScreenUpdating = False
'.Calculation = xlCalculationManual
.EnableEvents = False
End With
dblStart = Timer
Tabelle1.Range("a2:x20000") = ""
'Suchergebnisse_suchen_2.Clear
arr = Sheets("Kundendaten").Range("A3:X2000")
ReDim out(1 To UBound(arr, 2), 1 To UBound(arr))
For L = 1 To UBound(arr)
' Then
If LCase(arr(L, 1)) Like LCase(Kunden_suchen_2.TextBox1.Text) & "*" And _
LCase(arr(L, 2)) Like LCase(Kunden_suchen_2.TextBox2.Text) & "*" And _
LCase(arr(L, 3)) Like LCase(Kunden_suchen_2.TextBox3.Text) & "*" And _
LCase(arr(L, 4)) Like LCase(Kunden_suchen_2.TextBox4.Text) & "*" And _
LCase(arr(L, 5)) Like LCase(Kunden_suchen_2.TextBox5.Text) & "*" _
Then
K = K + 1
For i = 1 To UBound(arr, 2)
out(i, K) = arr(L, i)
Next
End If
Next
On Error Resume Next
ReDim Preserve out(1 To i - 1, 1 To K)
On Error GoTo 0
out = myTranspose(out) ' hier wir die Function myTranspose(arr) gebraucht
Tabelle1.Range("a2:x" & K + 1) = out
Dim lLZeile As Integer
Tabelle6.Range("a2:x2").Copy Tabelle1.Range("a1:x1")
lLZeile = Tabelle6.Cells(Rows.Count, 1).End(xlUp).Row
Suchergebnisse_suchen_2.RowSource = "filtertabelle!a2:Z" & lLZeile
With Application
.ScreenUpdating = True
'.Calculation = xlCalculationManual
.EnableEvents = True
End With
End Sub
Nun wäre es cool wenn man mit einem Textfeld (z.B die Spalte Name) mehrere Suchwörter in der betroffenen Spalte finden würde.
z.B. Eintrag in die TextBox ( Name ) Kai & sim.
Anschließend werden in der Listbox alle Datensätze die als Vorname Kai bzw. sim haben gezeigt.
Kann man so etwas realisieren?
mfg Thomas

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
ne Bsp-Datei per Upload wäre schön...owT
17.08.2021 08:29:28
Oberschlumpf
AW: ne Bsp-Datei per Upload wäre schön...owT
17.08.2021 09:28:54
Thomas
Hallo Oberschlumpf,
erstmal besten dank das du schon mal geschaut hast.
Im Anhang habe ich eine Beispieldatei angehangen.
https://www.herber.de/bbs/user/147666.xlsm
mfg thomas
AW: ne Bsp-Datei per Upload wäre schön...owT
17.08.2021 09:29:42
Thomas
Hallo,
ups habe den haken vergessen.
Sorry
mfg thomas
tja, leider...
19.08.2021 16:36:13
Oberschlumpf
Hi thomas,
...bekomm ich es nicht hin.
Seitdem ich deine Bsp-datei kenne, versuchte ich es jeden Tag mehrmals, eine Lösung zu programmieren.
Ich komm zwar in "Minischritten" vorwärts, aber ich werde es nicht schaffen, eine Lösung zu zeigen, bevor dieser Beitrag im Archiv "verschwindet".
Vielleicht versucht sich ja noch ein Anderer an einer Lösung.
Ciao
Thorsten
Anzeige
AW: tja, leider...
19.08.2021 21:18:44
Yal
Hallo zusammen,
das Problem liegt daran, dass Kombinationen entstehen:
Wenn ListBox2 drei Eingabe hätte, getrennt mit Semikolon: thom;sam;edi und eine andere zwei: abc;def,
dann gibt es 6 Kombinationen zu prüfen!
Also
Aufgabe 1: Kombinationen bilden (leere Listbox nicht vergessen)
Aufgabe 2: jede Zeile gegen jede Kombinationen prüfen.
Viel Spass
Ich habe ein Bisschen daran gearbeitet, aber noch keine fertige Lösung und ich weisse auch nicht, ob ich weitermachen werde (habe zuerst Urlaub)
VG
Yal
AW: tja, leider...
20.08.2021 00:42:40
Thomas
Hallo Yal und Oberschlumpf ,
habt rechtvielen dank, für eurer Interesse und vor allem dafür das ihr versucht habt das Problem zu lösen.
Vielleicht geht es so einfach nicht.
Ich werde mal nach einen anderen Ansatz suchen.
Sobald ich weiter gekommen bin, werde ich einen neuen Beitrag eröffnen.
mfg thomas
Anzeige
Warum aufgeben, es geht sehr wohl!
20.08.2021 02:07:12
Yal
Hallo Thomas,
es hat ein Bischen Nerven gekostet, aber es geht.
Ich weiss gar nicht warum Kollege Ransi über ein separates Blatt gehen muss. Es kostet viel Verarbeitungszeit. Problem ist, dass man muss ein 2-Dimensionale Array dem Listbox übergeben. Wer nur einen Eintrag gefiltert ist, kommt es zu einem unschönen Transpose. Ich löse es, in dem ich immer am Ende ein leeren Eintrag lege.
Ich habe daher alles was nicht zwingend notwendig ist rausgeworfen.
Wie gesagt, der Krux war die Kombinationen aufzubauen.
Träge die Liste mit Semikolon als Trenner:
Vorname: me;ma
Stadt: s;r

Sub suchen()
Dim strRef As String
Dim i, j, k, l
Dim bValid As Boolean
Dim out()
Const LetzteSpalte = 24 '24: Spalte X
Application.ScreenUpdating = False
Application.EnableEvents = False
'Application.Calculation = xlCalculationManual
Worksheets("Filtertabelle").Cells.ClearContents
ReDim out(1 To LetzteSpalte, 1 To 1)
'Herstellung der Kombinationen
For i = 1 To 5
strRef = Kombiniere(strRef, Kunden_suchen_2.Controls("TextBox" & i).Text)
Next
With Worksheets("Kundendaten")
For l = 3 To .Range("A99999").End(xlUp).Row
'Prüfung der aktuelle Zeile gegen alle Kombination
If strRef = "*;*;*;*;*" Then 'Verkürzung: keine Filterung
bValid = True
Else
bValid = False
For Each E In Split(strRef, "|") ' alle Kombinationen einzel durchgehen
Liste = Split(";" & E, ";")
bValid = LCase(.Cells(l, 1).Value) Like LCase(Liste(1)) _
And LCase(.Cells(l, 2).Value) Like LCase(Liste(2)) _
And LCase(.Cells(l, 3).Value) Like LCase(Liste(3)) _
And LCase(.Cells(l, 4).Value) Like LCase(Liste(4)) _
And LCase(.Cells(l, 5).Value) Like LCase(Liste(5))
If bValid Then Exit For 'Ist eine Kombi gültig, spart man sich den Rest
Next
End If
If bValid Then
k = k + 1
ReDim Preserve out(1 To LetzteSpalte, 1 To k + 1)
For i = 1 To LetzteSpalte
out(i, k) = .Cells(l, i).Value
Next
End If
Next
End With
Suchergebnisse_suchen_2.Clear
Suchergebnisse_suchen_2.List = WorksheetFunction.Transpose(out)
Application.ScreenUpdating = True
Application.EnableEvents = True
'Application.Calculation = xlCalculationManual
End Sub
Function Kombiniere(ByVal Basis, Neue) As String
Dim E, B
Dim tmp
Const cAB = "@@@@@" 'Ausnahme-Blocker
If Basis = "" Then Basis = cAB
For Each B In Split(Basis, "|")
B = IIf(B = cAB, "", B & ";")
If Neue = "" Then Neue = cAB
For Each E In Split(Neue, ";")
E = IIf(E = cAB, "*", E & "*")
tmp = tmp & "|" & B & E
Next
Next
Kombiniere = Mid(tmp, 2)
End Function
VG
Yal
Anzeige
das ist Zauberei. riesen riesen dank Yal
20.08.2021 10:55:11
Thomas
Hallo Yal,
das ist super super perfekt.
Riesen dank das du nicht aufgegeben hast. Und das sogar im Urlaub gemacht hast.
Das Makro hat nicht mal an Geschwindigkeit eingebüßt. Wahnsinn mit so ein " paar Zeilen ".
Ich wünsche dir einen super super und vor allem gesunden Urlaub.
hab riesen riesen Dank
mit vielen Grüßen
Thomas
an Yal UND Thomas
20.08.2021 14:31:19
Oberschlumpf
Hallo ihr Beiden,
Yal, auch ich finde, du hast ne super Lösung abgeliefert - Hut ab! :-)
(ich wär vllt auch noch zum Ziel gekommen, aber nach Gefühl würd ich sagen, ich hätt noch n paar Wochen gebraucht :-) )
an beide:
Yal wunderte sich, wieso Ransi "den Umweg" über eine Hilfstabelle machte.
Der Grund ist, dass in der Original-BSP-Datei von Thomas in der Listbox eine Überschriftenzeile enthalten ist (BoundColumn = 1)
Die Eigenschaft BoundColumn kann nur genutzt werden, wenn die Listbox über RowSource = gewünschter Zellbereich, hier A3:X?, gefüllt wird (? = letzte Zeile).
Das Befüllen einer Listbox mit Listbox.List = Range("A3:X?").Value oder mit For/Next und Listbox.AddItem usw überträgt die Daten nur in den Datenbereich einer Listbox - die oberste Zeile in Listbox (BoundColumn) bleibt leer.
Und für RowSource MUSS immer auf ein bestehendes Tabellenblatt verwiesen werden - deswegen hat Ransi über das extra Tabellenblatt gefiltert.
Da aber Thomas die Überschriftenzeile in Listbox nicht vermisst, kann alles so bleiben, wie es jetzt ist.
Ciao
Thorsten
RowSource
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige