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
Inhaltsverzeichnis

Volltextsuche in Array

Volltextsuche in Array
22.07.2021 08:30:30
Peter
Hallo,
ich suche schon die ganze Zeit nach einer Möglichkeit, mehrere Filter in einem Userform einzubauen. Mittlerweile habe ich es hinbekommen, dass man die Listbox in der Userform nach Datum und mehreren FilterBoxen eingrenzen kann. Hierzu nehme ich folgendes Sub:

Private Sub FilterBox1_Change()
Call Filterliste
End Sub

Private Sub FilterBox2_Change()
Call FilterListe
End Sub

.....

Private Sub FilterListe()
Dim lzeile As Long
Dim lZeileMaximum As Long
Dim i As Integer
Dim lAnzahl As Long
Dim col As New Collection
Dim varKreis, varArt, varStatus, varVolltext As String
Dim varDatumVon, varDatumBis As Date
Dim NrMonat As Integer
On Error GoTo Fehler 'sorgt dafür, dass wenn bei leerer Liste der Index-Fehler auftritt zum Ende gesprungen wird.
varKreis = Me.FilterBox1.Text
varArt = Me.FilterBox2.Text
varStatus = Me.FilterBox3.Text
varDatumVon = Me.FilterDatumVon.Text
varDatumBis = Me.FilterDatumBis.Text
'varVolltext = Me.Volltextsuche.Text
'Anzahl der Treffer-Zeilen ermitteln
lAnzahl = 0
For lzeile = LBound(arrListeAlle) To UBound(arrListeAlle)
If (varKreis = "(Alle)" Or varKreis = arrListeAlle(lzeile, 5)) And _
(varArt = "(Alle)" Or varArt = arrListeAlle(lzeile, 4)) And _
(varStatus = "(Alle)" Or varStatus = arrListeAlle(lzeile, 9)) And _
((varDatumVon = arrListeAlle(lzeile, 3))) Then
lAnzahl = lAnzahl + 1
col.Add lzeile
End If
Next
If lAnzahl > 0 Then
'Array für Listendaten dimensionieren
ReDim arrListe(1 To lAnzahl, 1 To 12)
'Listendaten in Array einlesen
For lAnzahl = 1 To col.Count
lzeile = arrListeAlle(col(lAnzahl), 1)
arrListe(lAnzahl, 1) = lzeile
arrListe(lAnzahl, 2) = CStr(Tabelle3.Cells(lzeile, 3).Text)
arrListe(lAnzahl, 3) = CStr(Tabelle3.Cells(lzeile, 4).Text)
arrListe(lAnzahl, 4) = CStr(Tabelle3.Cells(lzeile, 11).Text)
arrListe(lAnzahl, 5) = CStr(Tabelle3.Cells(lzeile, 12).Text)
arrListe(lAnzahl, 6) = CStr(Tabelle3.Cells(lzeile, 15).Text)
arrListe(lAnzahl, 7) = CStr(Tabelle3.Cells(lzeile, 16).Text)
arrListe(lAnzahl, 8) = CStr(Tabelle3.Cells(lzeile, 9).Text)
arrListe(lAnzahl, 9) = CStr(Tabelle3.Cells(lzeile, 8).Text)
arrListe(lAnzahl, 10) = CStr(Tabelle3.Cells(lzeile, 25).Text)
arrListe(lAnzahl, 11) = CStr(Tabelle3.Cells(lzeile, 26).Text)
arrListe(lAnzahl, 12) = CStr(Tabelle3.Cells(lzeile, 27).Text)
Next lAnzahl
Me.ListBox1.List = arrListe
Else
Me.ListBox1.Clear
End If
Fehler:
Set col = Nothing
End Sub

Kann mir jemand in diesen Code noch eine Echtzeitsuche für eine Textbox (Volltextsuche) integrieren, die jede Spalte des Arrays durchsucht und dabei auch die Filter mit berücksichtigt? Dann könnte ich dieses leidige Thema endlich abschließen. Prima wäre zb, wenn nach dem 3 Zeichen der Eingabe in der Textbox mit der Suche begonnen wird...

Private Sub Volltextsuche_Change()
'....Hier das Sub für die Volltextsuche....
Call FilterListe
End Sub

Ich hoffe ich konnte es verständlich erklären.
Vielen lieben Dank für Unterstützung.

11
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Volltextsuche in Array
22.07.2021 21:28:47
Yal
Hallo Peter,
Du hast eine bestimmte Idee im Kopf, wenn Du von "Volltextsuche" spricht, aber diese ist leider nicht so universell, dass wir auf anhieb verstehen können, was Du damit vorhast.
Ausserdem beschreibt bitte nochmal detailliert, wie die Filter "berücksichtigt" werden sollen.
Komplett "off-Topic": alle deine Variablen varXX sind nur einmal verwendet. Es macht den Code schwerer zu lesen. Du hast die FilterVon und FilterBis zweckgerichtet benannt. Warum nicht FilterBox1 und co?
so könnte dein Code aussehen (die "And" ohne "Or" immer zuerst. Die "And" lieber vorn als hinten):

For Each Elt In arrListeAlle
If Me.FilterDatumVon.Text = Elt(3) _
And (Me.FilterKreis.Text = "(Alle)" Or Me.FilterKreis.Text = Elt(5)) _
And (Me.FilterArt.Text = "(Alle)" Or Me.FilterArt.Text = Elt(4)) _
And (Me.FilterStatus.Text = "(Alle)" Or Me.FilterStatus.Text = Elt(9)) Then
lAnzahl = lAnzahl + 1
col.Add Elt
End If
Next
If col.Count = 0 Then
Me.ListBox1.Clear
Else
Aber wichitger sind die 2 erste Fragen.
VG
Yal
Anzeige
AW: Volltextsuche in Array
22.07.2021 21:51:35
Peter
Hallo Yal,
Vielen Dank für dein Feedback und die Verbesserung des Codes.
Volltextsuche meine ich eine Suche aus einer Textbox heraus, die mir das gesamte Array nach einem Buchstaben / Wort durchsucht - und dann in Echtzeit die Zeilen ausgibt und eingrenzt. Wenn ich quasi „Be“ tippe kommen alle Einträge, die die Wörter mit Be beinhalten…zb beinah Bergbau wenn ich weiter tippe „Bein“ kommen nur noch die Zeilen, deren Spalten Bein beinhalten als zb beinah.
Die anderen FilterBoxen unterfiltern dann meine Einträge „Bein“ noch zb nach einem Datum. Alles soll auch in Echtzeit funktionieren. Ich hoffe es war ein bisschen verständlicher.
Anzeige
AW: Volltextsuche in Array
22.07.2021 22:11:30
Yal
Hallo Peter,
am besten hast Du eine Listbox99, die die originale Liste beinhaltet und worauf immer zurückgegriefen wird.
Bei Änderung in der Eingabe-Feld "FilterText1" wird eine komplette neue Befüllung von ListBox1 auf Basis von ListBox99 und Filter(s) aufgerufen:

Private Sub FilterText1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
ListBox1_filtern Me.Text1.Text
End Sub
Private Sub ListBox1_filtern(FilterText As String)
Dim Elt
Application.EnableEvents = False
ListBox1.ClearContents
For Each Elt In ListBox99
If InStr(1, Elt, FilterText, vbTextCompare) Then ListBox1.AddItem Elt
Next
Application.EnableEvents = True
End Sub
Der "InStr" muss um die anderen Gültigkeit-Prüfungen ergänzt werden. Es muss aber so schlank wie möglich bleiben, um "real time" zu sein.
VG
Yal
Anzeige
AW: Volltextsuche in Array
23.07.2021 00:14:36
Peter
genau da hakt es ja leider. Ich weiss nicht, wie ich die Filter von meinem Quelltext oben, oder deiner Verbesserung, in das neue mit einbezogen bekomme….. Kannst Du mir da noch weiter helfen ? Wäre super nett....
AW: Volltextsuche in Array
23.07.2021 00:28:31
Yal
ungefähr so:

Private Sub FilterText1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
ListBox1_filtern Me.Text1.Text
End Sub
Private Sub ListBox1_filtern(FilterText As String)
Dim Elt
Application.EnableEvents = False
ListBox1.ClearContents
For Each Elt In ListBox99
If Me.FilterDatumVon.Text = Elt(3) _
And (Me.FilterKreis.Text = "(Alle)" Or Me.FilterKreis.Text = Elt(5)) _
And (Me.FilterArt.Text = "(Alle)" Or Me.FilterArt.Text = Elt(4)) _
And (Me.FilterStatus.Text = "(Alle)" Or Me.FilterStatus.Text = Elt(9)) _
And InStr(1, Join(Elt, ";"), FilterText, vbTextCompare) Then ListBox1.AddItem Elt
Next
Application.EnableEvents = True
End Sub

Anzeige
AW: Volltextsuche in Array
23.07.2021 00:27:15
Peter
For Each Elt In arrListeAlle
If Me.FilterDatumVon.Text And Me.FilterDatumBis.Text >= Elt(3) _
And (Me.FilterKreis.Text = "(Alle)" Or Me.FilterKreis.Text = Elt(5)) _
And (Me.FilterArt.Text = "(Alle)" Or Me.FilterArt.Text = Elt(4)) _
And (Me.FilterStatus.Text = "(Alle)" Or Me.FilterStatus.Text = Elt(9)) Then
lAnzahl = lAnzahl + 1
col.Add Elt
End If
Next
If col.Count = 0 Then
Me.ListBox1.Clear
Else
...
Der Code läuft irgendwie nicht. elt als Variant dimensioniert bringt immer Typen unverträglich
AW: Volltextsuche in Array
23.07.2021 00:32:00
Yal
Hallo Peter,
ohne ein aussagefähige Datei ist es schwierig einen Ferndiagnose zu herstellen. u.a. die Defintion von arrListeAlle steht nirgendwo.
VG
Yal
Anzeige
AW: Volltextsuche in Array
23.07.2021 00:37:08
Peter

Private Sub Auswahlliste_Alle()
Dim lzeile As Long
Dim lZeileMaximum As Long
Dim i As Integer
Dim lAnzahl As Long
Dim col As New Collection
'Um eine Schleife für alle Datensätze zu erhalten benötigen wir die letzte verwendete Zeile in der Tabelle
lZeileMaximum = Tabelle3.UsedRange.Rows.Count + 1
'Anzahl der nicht leeren Zeilen ermitteln
lAnzahl = 0
For lzeile = 5 To lZeileMaximum
'Nur wenn die Zeile benutzt / nicht leer ist, in List übernehmen
If IST_ZEILE_LEER(lzeile) = False Then
lAnzahl = lAnzahl + 1
col.Add lzeile
End If
Next
If lAnzahl > 0 Then
ReDim arrListeAlle(1 To lAnzahl, 1 To 12)
For lAnzahl = 1 To col.Count
lzeile = col(lAnzahl)
arrListeAlle(lAnzahl, 1) = lzeile
arrListeAlle(lAnzahl, 2) = CStr(Tabelle3.Cells(lzeile, 3).Text)
arrListeAlle(lAnzahl, 3) = CStr(Tabelle3.Cells(lzeile, 4).Text)
arrListeAlle(lAnzahl, 4) = CStr(Tabelle3.Cells(lzeile, 11).Text)
arrListeAlle(lAnzahl, 5) = CStr(Tabelle3.Cells(lzeile, 12).Text)
arrListeAlle(lAnzahl, 6) = CStr(Tabelle3.Cells(lzeile, 15).Text)
arrListeAlle(lAnzahl, 7) = CStr(Tabelle3.Cells(lzeile, 16).Text)
arrListeAlle(lAnzahl, 8) = CStr(Tabelle3.Cells(lzeile, 9).Text)
arrListeAlle(lAnzahl, 9) = CStr(Tabelle3.Cells(lzeile, 8).Text)
arrListeAlle(lAnzahl, 10) = CStr(Tabelle3.Cells(lzeile, 25).Text)
arrListeAlle(lAnzahl, 11) = CStr(Tabelle3.Cells(lzeile, 26).Text)
arrListeAlle(lAnzahl, 12) = CStr(Tabelle3.Cells(lzeile, 27).Text)
Next lAnzahl
End If
Set col = Nothing
End Sub

Anzeige
AW: Volltextsuche in Array
23.07.2021 01:07:04
Peter
Zur Vereinfachung hab ich mal ein File hochgeladen. Super wäre, wenn du die Filter zum laufen bekommst. Derzeit funktionieren die Box1-3 sowie die Datumsfilter. Was eben nicht geht, ist der Volltextfilter, wie eingangs beschrieben. Ich hoffe du kannst mir helfen, dass das klappt. Dann kann ich endlich weiterarbeiten... ist nur ein Testfile. Wenn Du noch Listbox oder sonstwas benötigst..bin für jeden Ansatz dankbar
https://www.herber.de/bbs/user/147266.xlsm
AW: Volltextsuche in Array
23.07.2021 22:48:27
Peter
Hey Yal, hast Du Dir das File mal angeschaut ? Kann man das irgendwie deichseln?
Anzeige
AW: Volltextsuche in Array
27.07.2021 14:36:35
yal
Hallo Peter,
sorry für meine späte Antwort. Ich habe nicht losgelassen.
Diese Listbox-Befüllung ist schon tückig: es geht tatsächlich am besten mit einem Array. Diese muss aber 2-dimensional sein, sonst meckert es, wenn es nur einen Eintrag hat. 2-Dim Array sind aber schwer zu dynamisieren, weil nur die zweite Dim variable sein kann. Es zwingt am Ende einem Transpose zu verwenden. Der Transpose macht aber aus einem einspaltigen Array ein 1-dimensionalen (einzeiligen) Array. Und das übernimmt den Listbox nicht.
Ich bin erst zu einem schlanken Ergebnis, wenn ich immer eine leere Eintrag am Ende übergebe, um mindestens 2 Zeilen zu haben. Die letzte wird anschliessend gelöscht:

Me.ListBox1.List = WorksheetFunction.Transpose(B)
Me.ListBox1.RemoveItem Me.ListBox1.ListCount - 1 'letzter Eintrag ist immer leer
Ich habe deine FilterBox1, 2, 3 in FilterBox_Kreis, FilterBox_Art und FilterBox_Status umbenannt. Das macht den Code leichter zu lesen. Ich habe auch viel abgespeckt und das Coding ist viel kleiner. Ich hoffe, Du findest dich wieder. Das wesentlich bleibt unverändert.
Überchriften und Beispiele (ABC, BCD, ...) habe ich umgestellt.
https://www.herber.de/bbs/user/147330.xlsm
Viel Erfolg damit
VG
Yal
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige