Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

"Live"-Suche

Forumthread: "Live"-Suche

"Live"-Suche
otto
Hallo Forum,
ich durchsuche ein Tabellenblatt mit ca. 2000 Zeilen. Der Suchbegriff wird während der Eingabe in eine Textbox gesucht. Es werden 3 Spalten durchsucht.
Gibt es eine Möglichkeit, das das ganze etwas schneller geht?
Hier der Code:
Private Sub TextBox1_Change() On Error Resume Next Dim arr() As Variant, Tmp As Variant, wks As Worksheet, zelle, preis1 As Currency, preis2 As _ Currency, preisg As Currency Dim index As Integer Dim X, anz, icount anz = 0 zelle = Cells(12, 4) Set wks = Sheets("Stamm") X = wks.Range("C65536").End(xlUp).Row Tmp = wks.Range("C4:CH" & 4 + X) X = X - 4 If TextBox1 = "" Then On Error GoTo weiter ReDim arr(0 To 5, 0 To X - 1) For index = 1 To UBound(Tmp, 1) On Error Resume Next arr(0, icount) = Tmp(index, 23) arr(1, icount) = Tmp(index, 35) arr(2, icount) = Tmp(index, 20) preis1 = Tmp(index, 37) preis2 = Tmp(index, 38) preisg = preis1 + preis2 arr(3, icount) = VBA.Format(preisg, "0.00") arr(4, icount) = Tmp(index, 2) arr(5, icount) = Tmp(index, 1) Next weiter: ListBox1.Clear Länge.Enabled = True Else For index = 1 To UBound(Tmp, 1) If VBA.LCase(Left(Tmp(index, 23), VBA.Len(TextBox1))) = VBA.LCase(TextBox1) _ Or Tmp(index, 23) Like "*" & VBA.UCase(TextBox1) & "*" _ Or Tmp(index, 23) Like "*" & VBA.LCase(TextBox1) & "*" _ Or VBA.LCase(Left(Tmp(index, 1), VBA.Len(TextBox1))) = VBA.LCase(TextBox1) _ Or Tmp(index, 1) Like "*" & VBA.UCase(TextBox1) & "*" _ Or Tmp(index, 1) Like "*" & VBA.LCase(TextBox1) & "*" _ Or VBA.LCase(Left(Tmp(index, 2), VBA.Len(TextBox1))) = VBA.LCase(TextBox1) _ Or Tmp(index, 2) Like "*" & VBA.UCase(TextBox1) & "*" _ Or Tmp(index, 2) Like "*" & VBA.LCase(TextBox1) & "*" Then ReDim Preserve arr(0 To 5, 0 To icount) arr(0, icount) = Tmp(index, 23) arr(1, icount) = Tmp(index, 35) arr(2, icount) = Tmp(index, 20) preis1 = Tmp(index, 37) preis2 = Tmp(index, 38) preisg = preis1 + preis2 arr(3, icount) = VBA.Format(preisg, "0.00") arr(4, icount) = Tmp(index, 2) arr(5, icount) = Tmp(index, 1) icount = icount + 1 anz = anz + 1 End If Next End If werticount = icount If icount 0 Then ListBox1.Column = arr Else ListBox1.Clear End If Start.Label117 = "(" & anz & ")" End Sub
>
Gruß
otto
Anzeige

6
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: "Live"-Suche
10.09.2010 14:54:19
Sobotta
Hallo Otto,
hast Du es mal mit .find versucht?
Nachstehend aus der VBA Hilfe.
Gruß
With Worksheets(1).Range("a1:a500")
Set c = .Find(2, lookin:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Value = 5
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address firstAddress
End If
End With
Anzeige
AW: "Live"-Suche
13.09.2010 10:26:44
otto
Hi,
ich glaube das ist kein Fall für .Find.
Hat jemand noch ne andere Idee?
otto
AW: "Live"-Suche
15.09.2010 09:01:37
bst
Morgen,
1. ändere Deinen If ab, der wird von VBA (leider!) immer komplett ausgewertet. Nimm etwas wie:
If a Then
bolFound = True
ElseIf b Then
bolFound = True
ElseIf c Then
bolFound = True
' ...
End If
If bolFound ...
Tue dabei - falls möglich - die wahrscheinlichsten Fälle nach vorne.
2. Ändere den Redim Preserve ab, der ist hier innerhalb der Schleife unnötig.
Nimm ReDim arr(0 To 5, 0 To UBound(Tmp, 1))) einmal VOR die Schleife, dann ist das Array auf alle Fälle groß genug und einmal ReDim Preserve arr(0 To 5, 0 To icount) nach der Schleife.
cu, Bernd
Anzeige
AW: "Live"-Suche
15.09.2010 13:30:38
otto
Hi,
danke für die Tipps, bin aber leider nicht in der Lage diese Codeteile sinvoll einzusetzen. (VBA bescheiden eben) Den bisher genutzten Code habe ich aus dem Netz und nur noch etwas angepasst.
otto
AW: "Live"-Suche
15.09.2010 16:17:10
bst
Hi,
Das Nachbauen wollte ich mir eigentlich sparen ...
Versuche den Else-Teil mal so, ungetestet.
cu, Bernd
--

Else
ReDim arr(0 To 5, 0 To UBound(Tmp, 1) - 1)
For index = 1 To UBound(Tmp, 1)
bolMatch = InStr(1, Tmp(index, 23), TextBox1, vbTextCompare) > 0
If Not bolMatch Then
bolMatch = InStr(1, Tmp(index, 1), TextBox1, vbTextCompare) > 0
If Not bolMatch Then
bolMatch = InStr(1, Tmp(index, 2), TextBox1, vbTextCompare) > 0
End If
End If
If bolMatch Then
arr(0, icount) = Tmp(index, 23)
arr(1, icount) = Tmp(index, 35)
arr(2, icount) = Tmp(index, 20)
preis1 = Tmp(index, 37)
preis2 = Tmp(index, 38)
preisg = preis1 + preis2
arr(3, icount) = VBA.Format(preisg, "0.00")
arr(4, icount) = Tmp(index, 2)
arr(5, icount) = Tmp(index, 1)
icount = icount + 1
anz = anz + 1
End If
Next
ReDim Preserve arr(0 To 5, 0 To icount - 1)
End If

Anzeige
AW: "Live"-Suche - Danke
16.09.2010 08:41:00
otto
Hallo Bernd,
danke, ich denke es geht schneller als bisher.
Bin voll zufrieden.
otto
;

Forumthreads zu verwandten Themen

Entdecke relevante Threads

Schau dir verwandte Threads basierend auf dem aktuellen Thema an

Alle relevanten Threads mit Inhaltsvorschau entdecken

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige