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

Laufzeitverlängerung Schleife in ListObject

Laufzeitverlängerung Schleife in ListObject
02.03.2016 12:48:07
Andreas
Hallo Herber Fans,
ich habe ein kurioses Phänomen festgestellt. Zum Hintergrund: Wenn Daten aus unterschiedlichen Quellen nach Excel gelangen, dann sind leere Zellen manchmal nicht wirklich leer und Zahlen haben zuweilen ein Hochkomma und lassen sich nicht als echte Zahl darstellen. Ich habe mir für diese Bereinigung von Daten also eine Schleife geschrieben, welche auf If .Value = „“ prüft, bzw. Zahlen über .Formula = .Value hart umwandelt. Das hat auch gut funktioniert.
Seit einigen Monaten stelle ich nun viele meiner Dateien auf die ListObjects (eingeführt mit Excel 2007) um. Der Vorteil ist, daß sich dieser Tabellentyp automatisch erweitert und ich Formeln über strukturierte Verweise gut verwalten kann. ABER: Wenn ich o.g. Schleife in einem ListObject laufen lassen, dann benötigt diese für die gleiche Anzahl von Zellen deutlich länger als auf einem normalen Tabellenblatt. Das Deaktivieren von ScreenUpdating, EnableEvents und Calculation hat nichts gebracht. Ich vermute, aufgrund der Verbindung von allen Zellen zu einem Gesamtkonstrukt (Es läßt sich ja eine Ergebniszeile berechnen.) sich die Laufzeit so erhöht.
Bisher hat eine Laufzeitoptimierung immer ganz gut funktioniert:
Normales Tabellenblatt: ScreenUpdating, EnableEvents, Calculation deaktivieren
Pivot: .ManualUpdate = True/ False
ListObject: ?
Kurios ist auch Folgendes: Die längere Laufzeit tritt i.d.R. nur zu Tage, wenn eine Zelle des ListObjects selektiert ist. Wenn ich die Selection außerhalb des ListObjects habe, dann ist die Laufzeit kürzer. In der Beispieldatei kann das getestet werden, wenn die Prozedur „SchleifenTest“ mit der Selektion ListObject!B3 bzw. ListObject!A3 ausgeführt wird. In der angefügten Beispieldatei sind es nur ca. 7.000 Zellen als Testszenario. Im echten Leben muß ich manchmal über 8 Spalten zu je 50.000 Zellen rüber. Bei 400.000 Zellen ist die Laufzeitverlängerung in ListObjects dann nicht mehr tolerierbar.
https://www.herber.de/bbs/user/104034.xlsm
Fazit: Hat jemand den von mir festgestellten Effekt auch schon einmal beobachtet?
Kennt jemand eine Möglichkeit die Laufzeit einer Schleife über ein ListObject zu optimieren, ohne mit der Selektion „spielen“ zu müssen?
Vielen Dank für Eure Rückmeldungen und Ideen!
Grüße, Andreas Hanisch

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Laufzeitverlängerung Schleife in ListObject
02.03.2016 14:30:22
Michael
Hi Andreas,
Du durchläufst in Deiner Schleife jede Zelle einzeln, das dauert...
For Each c In r
With c
.Formula = .Value
End With
Next c
Mit diesem Schnipsel:
a = r.Value
r = a
(oben wurde a als Variant geDimt)
bist Du bei rund 12% des Zeitaufwands.
Kommentiere spaßhalber mal die Zellen aus, in denen Du das screenupdating usw. abschaltest...
Übrigens gebe ich lieber aus: Debug.Print (Timer - t) * 1000 & " ms"
da sehe ich bei wenigen Daten, was sich in ms ändert.
Schöne Grüße,
Michael

Anzeige
AW: Laufzeitverlängerung Schleife in ListObject
07.03.2016 18:11:19
Andreas
Hallo Michael,
danke für Deinen Tip. Diese Methode kannte ich noch nicht, aber sie macht einen sehr profunden Eindruck auf mich und ich werde sie eingehender testen.
Dein Ansatz hat mich aber noch zu einer weiterführenden Thematik gebracht. Ich habe versucht den Ansatz auch für Datumsangaben einzusetzen
'Unechte' Datumszellen habe ich bisher immer mit folgender Schleife bearbeitet.
For Each c In .Cells
With c
If IsDate(.Value) Then
iD = Day(.Value)
iM = Month(.Value)
iY = Year(.Value)
.FormulaR1C1 = iM & "/" & iD & "/" & iY
End If
End With
Nun würde ich auch bei Datumsangaben die rechenintensive Schleife ablösen und Deine Methode einsetzen. In der angefügten Beispieldatei hat es bei den (umrandeten) Datumsangaben jedoch leider nicht funktioniert.
https://www.herber.de/bbs/user/104167.xlsm
Muß ich 'a' anders deklarieren? Oder geht es nicht für Datumsangaben?
Vielen Dank für einen weiterführenden Tip!
Beste Grüße, Andreas Hanisch

Anzeige
AW: Laufzeitverlängerung Schleife in ListObject
07.03.2016 20:17:58
Michael
Hi Andreas,
versuch's mal damit:
Sub ZahlenUmwandelnMethodeMicha2()
Dim r As Range
Dim a As Variant
Dim x As Long, y As Long
Set r = Selection
a = r.Value
For x = LBound(a, 1) To UBound(a, 1)
For y = LBound(a, 2) To UBound(a, 2)
If IsDate(a(x, y)) Then a(x, y) = DateValue(a(x, y))
Next
Next
r = a
End Sub
Anstelle des DateiValue kannst Du ja Deine Variante mit den "/" einsetzen.
Hauptsache, das passiert alles im Array (sprich "Speicher"), ohne Tabellenzugriffe (als ob die nicht auch im RAM wären - wo sonst?).
Schöne Grüße,
Michael

Anzeige
AW: Laufzeitverlängerung Schleife in ListObject
08.03.2016 15:23:55
Andreas
Hallo Michael,
Wow! Das nenne ich mal einen cleveren Ansatz! Ich werde ihn hoffentlich heute Abend testen können. (Bin mir aber sicher, daß er läuft...)
Habe vielen Dank! Deine beiden Hilfestellungen werden meine Codes für die Datenqualität signifikant verbessern.
Grüße aus Berlin, Andreas

ok, danke & Grüße zurück owT
08.03.2016 19:08:56
Michael

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige