Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
24.04.2024 17:19:09
Anzeige
Archiv - Navigation
1176to1180
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

"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

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
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

300 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige