Laufzeitverlängerung Schleife in ListObject
02.03.2016 12:48:07
Andreas
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