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

Filtercode langsam

Filtercode langsam
08.03.2018 05:09:49
Anja
Hallo,
irgendwie ist mein Thread im Archiv gelandet und kann nicht mehr beantwortet werden? Ursprungsthema: https://www.herber.de/cgi-bin/callthread.pl?index=1611592#1611592
Daraus hat sich schon folgender Code ergeben, um damit 1 Kriterium in 2 verschiedenen Spalten zu filtern. Dieser funktioniert auch sehr gut.

Sub Ausblenden()
Dim Zelle As Range
Dim Bereich As Range
Cells.EntireRow.Hidden = False
For Each Zelle In Range(Cells(5, 1), Cells(4, 1).End(xlDown))
If WorksheetFunction.CountIf(Zelle.Offset(0, 1).Resize(, 2), Range("C1").Value) = 0 Then
If Bereich Is Nothing Then
Set Bereich = Zelle
Else
Set Bereich = Union(Bereich, Zelle)
End If
End If
Next
If Not Bereich Is Nothing Then Bereich.EntireRow.Hidden = True
End Sub
Ich habe nur ein Problem. In der echten Datei dauert das Filtern sehr lange. Weiß jemand was das verursachen kann?
In der Testdatei läuft alles einwandfrei. Ich habe auch versucht ein paar Sachen nachzustellen. Die Testdatei hat nun mehr KB als die Originale. Ich habe einige Formatierungen (Rahmenlinien, Farbfüllungen) vorgenommen und auch weitere Daten hinterlegt und zusätzliche Tabellenblätter mit Inhalt gefüllt. Außerdem habe ich ein paar bedingte Formatierungen hinzugefügt. So wie bei der Originalen bzw. jetzt noch mehr von allem.
Auch den Suchbereich habe ich erweitert. Denn im Original sind die zu durchsuchenden Spalten nicht direkt nebeneinander. Also habe ich "Resize" auf 4 gesetzt.
Aber all das führte nicht dazu, dass das Filtern länger dauert. Daher kann ich mir die Ursache einfach nicht erklären.

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

Betreff
Datum
Anwender
Anzeige
AW: Filtercode langsam
08.03.2018 08:01:59
fcs
Hallo Anja,
ich habe Anweisungen zur Beschleunigung der Makroausführung eingbaut.
https://www.herber.de/bbs/user/120276.xlsm
Zusätzlich Variante, die in einer Hilfsspalte die Fundstellen markiert und dann die anderen Zeilen ausbelendet.
eine weitere Möglichkeit zur Beschleunigung bei sehr vielen daten: zu durchsuchene daten in Array laden und per Shleife durchsuchen.
Gruß
Franz
AW: Filtercode langsam
09.03.2018 08:27:58
Anja
Danke. Das hat den Suchlauf zumindest von 30 auf 10 Sekunden reduziert.
Was ich nicht ganz verstehe: Es gibt eine weitere, ähnliche, Datei für letztes Jahr. Wenn ich dort den Code implementiere, dann findet er die Werte plötzlich nicht mehr. Sie ist leicht anders aufgebaut und die zu durchsuchenden Spalten befinden sich in J und L. Also habe ich folgende Änderung vorgenommen:
If WorksheetFunction.CountIf(Zelle.Offset(0, 10).Resize(, 3), Range("E1").Value) = 0 Then
Aber das geht irgendwie nicht. Es kommt die MsgBox, dass kein Suchergebnis gefunden wurde.
In der anderen Tabelle konnte ich auch einfach auf
If WorksheetFunction.CountIf(Zelle.Offset(0, 14).Resize(, 4), Range("E1").Value) = 0 Then
ändern, da die Daten in den Spalten O und R stehen. Das funktioniert.
Ist doch korrekt oder?
Anzeige
AW: Filtercode langsam
09.03.2018 08:58:14
Daniel
Hi
du hast dich beim Offsetwert verrechnet.
der Offsetwert ergibt sich nach der Berechnung: Spalte Zielzelle - Spalte Ausganszelle
wenn du von Spalte A(1) nach Spalte J(10) willst, ergibt dass einen Offest(0, 10 - 1) also .Offset(0, 9)
wenn du lieber mit konkreten Spaltenbuchstaben arbeiten willst, kannst du statt
Zelle.Offset(0, 9).Resize(, 3)
auch schreiben:
Intersect(Zelle.EntireRow, Range("J:L"))
dann brauchst du da nichts rechnen und es ist auch egal, in welcher Spalte sich die Variable ZELLE befindet.
Gruß Daniel
AW: Filtercode langsam
09.03.2018 10:50:55
Anja
Hallo Daniel,
danke für die Aufklärung.
Aber es funktioniert trotzdem nicht. Jetzt bin ich richtig verwirrt. :(
Beide Varianten spucken "Suchwert nicht gefunden" aus. Ich habe auch einfach mal "Auto" irgendwo reingeschrieben damit ein ganz simples Wort nur gesucht werden muss. Habe die Dropdowns entfernt und die Zellen gleich formatiert. Aber nichts.
Jetzt hab ich noch mal eine Testdatei gemacht um das mit Spalte J und L zu prüfen. Jetzt verschwindet einfach die Überschrifts-Zeile beim Filtern. Ich dachte ich hätte den Code verstanden, da meine Änderungen für die andere Datei auch funktionierten, aber scheinbar ist das nicht so.
Eine Testdatei habe ich noch mal hochgeladen und der Code sieht so aus:
https://www.herber.de/bbs/user/120304.xlsm
 With wks
HS = 50  'Hilfsspalte für Markierung
'alle Zeilen einblenden
.Rows.Hidden = False
'Suchbegriff merken
.Columns(HS).ClearContents
varSuch = .Range("E1").Value
For Each Zelle In .Range(.Cells(6, 1), .Cells(4, 1).End(xlDown))
If WorksheetFunction.CountIf(Intersect(Zelle.EntireRow, Range("J:L")), varSuch) > 0  _
Then
.Cells(Zelle.Row, HS) = "X"
End If
Next
varSuch = .Cells(4, 1).End(xlDown).Row
With .Range(.Cells(6, HS), .Cells(varSuch, HS))
If Application.WorksheetFunction.CountIf(.Cells, "X") > 0 Then
.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
Else
MsgBox "Suchwert nicht gefunden!"
End If
End With
End With

Anzeige
AW: Filtercode langsam
09.03.2018 11:29:47
Daniel
Hi
das liegt daran, dass du den Zeilenbereich für die Schleifen falsch bestimmst.
du machst da zwei Fehler:
1. du durchsuchst eine Spalte, die Leer ist, Spalte A hat aber in der Beispieldatei keine Daten.
du musst die letzte benutze Zeile in einer Spalte suchen, die Daten enthält, und zwar möglichst ohne lücken.
2. wenn du die letzte benutze Zeile mit End(xldown) suchst, musst die Absprungzelle gefüllt sein.
Du springst aber aus der Zeile 4 los und die ist leer, damit geht der sprung auch nur bis zur nächsten gefüllten Zelle.
Du musst hier aus der Überschriftenzeile lospringen (Zeile 5).
oder als alternative: spring von der ganz untersten Zeile nach oben: Cells(rows.count, x).end(xlup).Row
3. du solltest für unteschiedliche Dinge auch unterschiedliche Variablen verwenden.
Wenn du varSuch einmal für den Suchbegriff und einmal für die Zeilennummer der letzten Zeile verwendest, dann kommt man schnell durcheinander.
With wks
HS = 50  'Hilfsspalte für Markierung
'alle Zeilen einblenden
.Rows.Hidden = False
'Suchbegriff merken
.Columns(HS).ClearContents
varSuch = .Range("E1").Value
letzteZeile = .Cells(5, 10).end(xldown)
For Each Zelle In .Range(.Cells(6, 1), .Cells(letzteZeile, 1))
If WorksheetFunction.CountIf(Intersect(Zelle.EntireRow, Range("J:L")), varSuch) > 0  _
_
Then
.Cells(Zelle.Row, HS) = "X"
End If
Next
With .Range(.Cells(6, HS), .Cells(letzeZeile, HS))
If Application.WorksheetFunction.CountIf(.Cells, "X") > 0 Then
.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
Else
MsgBox "Suchwert nicht gefunden!"
End If
End With
End With
Gruß Daniel
Anzeige
AW: Filtercode langsam
10.03.2018 02:20:01
fcs
Hallo Anja,
hier eine Variante, die bei mehreren 1000 Datenzeilen nochmals um den faktor 2 bis 3 schneller sein sollte. Die zu durchsuchenden Daten werden dabei in ein Daten-Array geladen. Dadurch reduziert sich die
Anzahl der zeitfressenden Zugriffe auf Zellen im Tabellenblatt.
Den Hinweis von Daniel bzgl. letzte Datenzeile hab ich auch berücksichtigt, aber eine andere Methode verwendet, bei der keine Spalte vorgegben werden muss.
Gruß
Franz
Sub Ausblenden_via_Array()
Dim varSuch As Variant
Dim HS As Long
Dim Zelle As Range
Dim Bereich As Range
Dim wks As Worksheet
Dim Zeile As Long, Zeile_L As Long, Zeile_1 As Long
Dim StatusCalc As Long
Dim arrSuche, Spa As Long
'Makrobremsen lösen
With Application
.ScreenUpdating = False
StatusCalc = .Calculation
.Calculation = xlCalculationManual
.EnableEvents = False
End With
Set wks = ActiveSheet
With wks
HS = 50                 'Hilfsspalte für Markierung
Zeile_1 = 6             '1. zu durchsuchende Zeile
'alle Zeilen einblenden
.Rows.Hidden = False
'alte Suchmarkierungen löschen
.Columns(HS).ClearContents
'Suchbegriff merken - alles in Kleinbuchstaben
varSuch = LCase(.Range("E1").Value)
'letzte Zeile mit Inhalt suchen
Set Zelle = .Cells.Find(What:="*", After:=.Cells(1, 1), LookIn:=xlValues, _
lookat:=xlWhole, searchorder:=xlByRows, searchdirection:=xlPrevious)
If Zelle Is Nothing Then
Zeile_L = 1
MsgBox "Tabellenblatt ist leer"
GoTo Beenden
Else
Zeile_L = Zelle.Row
End If
If Zeile_L  0 Then
.SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True
Else
MsgBox "Suchwert nicht gefunden!"
End If
End With
End With
Beenden:
'Makrobremsen zurüksetzen
With Application
.ScreenUpdating = True
.Calculation = StatusCalc
.EnableEvents = True
End With
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige