Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1328to1332
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

Filter

Filter
19.09.2013 11:24:23
Dudzik
Hallo Excel-Spezialisten,
aus einer mehrspaltigen Tabelle mit über 1000 Datensätzen muss ich die Datensätze ermitteln, die in einer Spalte eine vorher definierte Zeichenkette enthalten. In dieser Spalte steht ein Betreff aus mehreren Wörtern. Wenn ein Wort aus dieser Betreff-Zelle vorhanden ist, soll dieser Datensatz oder diese Datensätze angezeigt werden.
VBA soll für diese Lösung ausscheiden, da die Schleifenabfolge zu langsam ist.
Gibt es dafür eine Excel-Lösung? Vielen Dank für Eure Bemühungen!
Freundliche Grüße
Matthias

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

Betreff
Datum
Anwender
Anzeige
AW: Filter
19.09.2013 11:26:13
Hajo_Zi
Hallo Matthias,
warum nicht Autofilter, enthält?

AW: Filter
19.09.2013 13:12:05
Luschi
Hallo Matthias,
wie kommst Du drauf, das Vba hier zu langsam sei. Wenn man die typischen Excel-Bremsen abschaltet und erst alle Zeilen, die nicht zu sehen sein sollen, in einem Objekt sammelt, dann brauch meine Routine mit 1500 Zeilen weniger als 1 SEKUNDE!
Gruß von Luschi
aus klein-Paris

AW: Filter
19.09.2013 13:22:09
Dudzik
Hallo Luschi,
wie würde so etwas im Script aussehen? Die üblichen Methoden: Application.Calculate und Application.ScreenUpdating sind bekannt. Die For each-Schleife für einen vordefinierten Bereich ist zwar schneller als eine Zählschleife, aber wie kann ich die nicht anzuzeigenden Zeilen in einem Objekt zusammenfassen, um die Sache zu beschleunigen?
Freundliche Grüße
Matthias

Anzeige
AW: Filter
19.09.2013 13:51:48
Luschi
Hallo Matthias,
versuch es mal so:

Sub Machmal()
Dim ws As Worksheet, rg1 As Range, rg2 As Range, rg3 As Range
Dim s As String, n As Long
Debug.Print Time
Set ws = Tabelle1
'Suchbegriff
s = ws.Range("E1").Value
ws.Columns(1).EntireRow.Hidden = False
n = ws.Cells(ws.Rows.Count, 2).End(xlUp).Row
Set rg1 = ws.Range("B3:B" & n)
For Each rg2 In rg1
If rg2.Value  "" Then
If InStr(1, rg2.Value, s, vbTextCompare) > 0 Then
If rg3 Is Nothing Then
Set rg3 = rg2
Else
Set rg3 = Application.Union(rg3, rg2)
End If
End If
End If
Next rg2
If Not (rg3 Is Nothing) Then
rg3.EntireRow.Hidden = True
Debug.Print rg3.Address
End If
Set rg3 = Nothing: Set rg2 = Nothing: Set rg1 = Nothing
Set ws = Nothing
Debug.Print Time
End Sub
Sub getMoreSpeed(xOk As Boolean)
Application.ScreenUpdating = xOk
Application.EnableEvents = xOk
If xOk Then
Application.Calculation = xlCalculationManual
Application.Cursor = xlWait
Else
Application.Calculation = xlCalculationAutomatic
Application.Cursor = xlDefault
End If
End Sub
Gruß von Luschi
aus klein-Paris

Anzeige
AW: Filter
19.09.2013 14:13:19
Dudzik
Hallo Luschi,
du hast Recht gehabt. Durch die Union-Methode können alle nichtbenötigte Zellen gesammelt und dann im Anschluss mit einer Anweisung beseitigt werden. Das ist eine sehr gute Idee. Ich hatte versucht, die Sache mit einer Collection zu realisieren. Es war aber viel zu langsam - und ich kann nicht genau sagen, bis wieviel Datensätze die Collection überhaupt sinnvoll ist. Auf alle Fälle, Deine Lösung ist hervorragend. Recht herzlichen Dank für die Hilfe!!!
Freundliche Grüße
Matthias

AW: Filter
19.09.2013 14:34:36
Luschi
Hallo Matthias,
der eigentliche Hintergrund für das Sammeln ist, das Excel ab Version 2003 bei jedem Hidden-Befehl die Tabelle einmal durchrechnet. Collection, ArrayList, Dictionary usw. sind dafür nicht die geeigneten Objekte.
Gruß von Luschi
aus klein-Paris
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige