Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
852to856
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
852to856
852to856
Aktuelles Verzeichnis
Verzeichnis Index
Verzeichnis Index
Übersicht Verzeichnisse
Inhaltsverzeichnis

FIND macht Excel langsam

FIND macht Excel langsam
09.03.2007 15:22:00
Michel

Hallo zusammen,
ich habe da mal ein Problem, welches ich bisher nicht lösen konnte - auch nicht durch das Suchen in Google und anderen Foren. Ich bin zwar Ansatzweise auf Ideen gestoßen, die bisher aber nicht wirklich halfen....
Die Aufgabenstellung:
Es geht um eine Liste in Excel, welche >10.000 Zeilen und > 80 Spalten ist. In dieser Liste sind Gruppen mit eindeutigen Zahlencodes codiert. Jede dieser Gruppe hat spezifische Eigenschaften, welche innerhalb der Gruppe gleich sein sollen. Dies gilt es zu prüfen.
VBA-Ansatz:
While ActiveSheet.Cells(x, 5).Text <> ""
If ActiveSheet.Cells(x, 16).Text <> "" And ActiveSheet.Cells(x, 4).Text = "" Then
Set rawrow = ActiveSheet.Range(Cells(x, 16), Cells(z + 11, 16)).Find(ActiveSheet.Cells(x, 16).Text, LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False)
If Not rawrow Is Nothing Then
startrow = rawrow.Row
ActiveSheet.Cells(startrow, 4).Value = "CHECKED"
Do
.....
hier folgen die Prüfparameter innerhalb der Gruppe
.....
Set rawrow = ActiveSheet.Range(Cells(x, 16), Cells(z + 11, 16)).FindNext(rawrow)
Loop While Not rawrow Is Nothing And rawrow.Row <> startrow
End If
End If
Set rawrow = Nothing
x = x + 1
Wend
Dabei gilt für z+11 > x
Es wird nur geprüft, wenn auch eine Gruppennummer vergeben ist. (1. IF Bedingung im Code)
[x,4] ist als Flag gedacht, so daß keine doppelte Prüfung erfolgt. (1. IF Bedingung im Code)
Weiterhin wird das Suchfeld dynamisch eingeengt, da alles vor x ja schon geprüft wurde. (SET Befehl für Objekt rawrow)
Es handelt sich also letztendlich um eine triviale FIND Methode bezogen auf eine RANGE.
Das Problem:
Es ist so, daß Excel den Code immer langsamer bzw. sehr gemächlich abarbeitet, obwohl eine dynamische Einengung des Suchbereiches erfolgt. Eigentlich müsste die Geschwinigkeit mit zunehmender Anzahl an Prüfungen zunehmen.
Ein weiteres Phänomen tritt auf, wenn das Makro beendet bzw. abgebrochen wird. Wird nun die Suchfunktion in Excel (STRG-F) bemüht, so quält sich Excel durch das Tabellenblatt duch. Man kann dabei zusehen wie es die einzelnen Zellen (erkenntlich im Namenfeld) durchrattert. Wenn das Tabellenblatt frisch geladen ist geht das ohne Zeitverzögerung.
Die Frage ist, woran das liegen mag. Liegt hier ein genereller Fehler in Excel vor (z.B. HEAP/STACK Fehler, Speichermanagement, Garbage Collection, etc...) oder ist das ein Feature von Bill?
Es ist ziemlich nervig, da die Prodzedure im Moment 4-5 Stunden dauert.
Vielleicht hatte jemand schon mal ein ähnliches Problem oder kennt einen Bärentrick wie man das umschifft.
PS:
In einem älteren Thread wurde dieses Thema schon mal ähnlich diskutiert. Dies Früchte dessen habe ich im Code schon eingebaut: SET rawrow = NOTHING. Das hilft aber auch nix.
Ich hoffe auf eine rege Diskussion und brauchbaren Ideen. Danke!
Grüßle,
michel

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: FIND macht Excel langsam
09.03.2007 16:54:00
IngGi
Hallo Michel,
eine allgemeine Überlegung wäre es, die komplette Matrix in ein Datenfeld einzulesen und alles Weitere dann im Datenfeld zu erledigen.
Vorteil:
Über die Zeilen
Dim daten
daten = Range("A1:CB10000")
läßt sich die Matrix sehr schnell und komfortabel in das Datenfeld einlesen. Du erhälst dabei ein zweidimensionales Datenfeld mit den Abmessungen daten(1 bis 10000 Zeilen, 1 bis 80 Spalten). Und mit
Range("A1:CB10000") = daten
läßt sich das Datenfeld genauso schnell wieder zurückschreiben. Die Bearbeitung der Daten sollte im Datenfeld deutlich schneller gehen, obwohl du z.B. die Find-Methode nicht nutzen kannst, sondern alle Einzelpositionen in Schleifen abklappern musst.
Nachteil:
Das ist natürlich eine komplett andere Herangehensweise, die eine umfangreiche Neuprogrammierung erfordert. Daher ist das vielleicht auch nur der letzte Notnagel, falls alle Stricke reißen.
Gruß Ingolf
Anzeige
AW: FIND macht Excel langsam
09.03.2007 19:48:23
Michel
Hallo Ingolf,
ist ne nette Idee und ich denke ich werde am Montag mal einen Versuch damit starten. Jetzt ist erstmal Wochenende... Danke für die schnelle Antwort.
Dennoch besteht das Problem weiterhin und ich denke viele User werden sich daran irgendwie die Zähne ausbeißen. Mich wurmt es - wenn es denn so sein soll - daß das nicht über eine triviale FIND Funktion zu lösen ist, ohne den dummen Faktor Zeit.
Hat den jemand technische Details zu diesem "Feature", also warum sich Excel hier so zickig verhält?!
Grüßle,
michael
AW: FIND macht Excel langsam
09.03.2007 19:54:53
Josef
Hallo Michael,
der Zeitverlust wird garantiert nicht von ".Find" verursacht, das ist nähmlich sauschnell.
Die Zeit geht wahrscheinlich in den Schleifen Innerhalb und Außerhalb verloren.
Man bräuchte aber mehr Info und evtl. ein Beispielblatt, um an der Laufzeit zu arbeiten.
Gruß Sepp
Anzeige
AW: FIND macht Excel langsam
12.03.2007 09:00:00
Michel
Hallo Sepp,
ich muß dir leider widersprechen!!! Es ist DEFINITIV die Funktion FIND.
Der Debugmode (Step-by-Step) entlarvt genau die Stelle, die Zeit frißt und das ist, wenn SET irgendwas = objekt.find(option) ausgeführt wird, also der Puffer von FIND neu geladen/definiert wird. FINDNEXT geht dann so lala, aber auch nicht zufriedenstellend. Das habe ich alles schon mal schneller gesehen.
Behauptungen dieser Art (...garantiert nicht....ist nämlich sauschnell.) helfen leidere nicht weiter. Die Schleife hat hier nix zu tun außer eine Abbruchbedingung zu schaffen. Lies den Code - hiert sind alle relevanten Dinge enthalten!
Ich habe das dumme Gefühl, daß FIND hier speichermäßig unfug macht.
Grüßle,
michael
Anzeige
AW: FIND macht Excel langsam
12.03.2007 21:51:20
Josef
Hallo Micheal,
1. Ist es keine Behauptung das "Find" Sauschnell ist, sondern eine Tatsache.
Ich habe gerade in einer Tabelle 1.500.000 Zellen mit zufälligen Zahlen gefüllt und
anschließend per Find-Next durchsucht. Ergebnis: 1677 Fundstellen 0,9 s; 1795 Fundstellen 0,9 s;
1654 Fundstellen 0,8 s.
2. Vermute ich, das entweder deine Datei korrupt ist, vielleicht mal alles in eine neue Mappe kopieren
und dort testen, oder das du vielleicht mit deinem Code Ereignisse anstösst die, mehrfach aufgerufen,
zu dem Zeitverlust führen.
Vielleicht hilft es, wenn du die Ereignisüberwachung ausschaltest und die Berechnung auf manuell stellst.
Gruß Sepp
Anzeige
AW: FIND macht Excel nicht langsam
13.03.2007 21:36:41
Gerd
Hallo Sepp,
zu 1. schließe ich mich deiner Feststellung in vollem Umfang an.
zu 2. muss nicht sein.
Was Zeit "frisst" ist wohl eher das permante Neuinitialisieren des Range pro Zeile (x - mal Set..).
Die Rede war glaub' ich von mehr als 10.000 Zeilen.
Ob der Codeaufbau so notwendig ist, kann man -ohne den vollständigen Code u. die Datenstruktur zu kennen-
allerdings nicht sagen.
Gruß
Gerd
AW: FIND macht Excel nicht langsam
13.03.2007 23:47:15
Michel
Hallo Sepp,
FIND ist nicht langsam. Das ist fakt und das habe ich auch nicht angezweifelt. Deswegen benutze ich diese Methode auch. Es WIRD aber langsam aus irgendwelchen Gründen, die ich bisher nicht verstehe.
Wie würdest du das interpretieren: per DEBUG einmal den Code bis zur Stelle, an der das Objekt erzeugt wird (SET rawrow = ....) laufen lassen. Dann den Code stoppen und per Hand (STRG-F) versuchen etwas zu finden.... Ergebnis: Excel sucht sich zu tode. Das ist das Phänomen. Dasselbe passiert auch während der Laufzeit: das SET braucht sehr lange. Damit ist auch der Hinweis von Gerd mehr oder entkräftet, da ein mehrmaliges setting nicht stattfindet, wenn ich das Ding debugge.
Der Codeaufbau ist soweit notwendig, denn die Gruppen sind innerhalb der 10.000 Zeilen chaotisch verteilt.
Noch etwas: ich habe mal spaßeshalber die Suchliste in ein neues Tabellenblatt kopiert und den Code darauf losgelassen. Das Ergebnis: es funktioniert wunderbar! Innerhalb von <2 min. sind alle Gruppen identifiziert und gechecked.
Das liegt die Möglichkeit eines generellen Fehlers im Tabellenblatt nahe. Das komische dabei ist, daß sich die Datei ohne Probleme öffnen läßt und alle Funktionen (Filter, Sortieren, etc.) auch ohne Probleme funktionieren. Ich denke ich werde auf eine "Schattenkopie" ausweichen und dort die Gruppen identifizieren.
Grüßle
micha
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige