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

Laufzeit des Makros optimieren

Laufzeit des Makros optimieren
19.09.2008 09:32:11
Ladengast
Hallo zusammen,
ich habe ein Makro erstellt das aufgrund der stetig anwachsenden Datenmenge nun mehrere Stunden läuft. Mir ist schon klar, dass es bei einer großen Datenmenge auch eine gewisse Zeit braucht die Berechnungen durchzuführen, aber vielleicht kommen eure kreativen Köpfe auf eine Optimierung des Codes an die ich noch nicht gedacht habe oder die ich nicht kenne.
Hier die Randbedingungen:
Die Exceldatei hat ca. 60.000 Zeilen. In jeder Zeile gibt es einen 160-stelligen String. Es werden immer 4 Stellen des Strings ausgelesen, dann getrennt in die ersten 2 Stellen und die letzten 2 Stellen, welche dann umgerechnet werden.
Also, aus einem 160-stelligen String werden 40 Einzelstrings die dann berechnet werden. Das ganze multipliziert mit der Zeilenanzahl und man hat dann mal locker 2,4 Mio. Berechnungen. Wie gesagt, dass das ganze eine gewisse Zeit benötigt ist mir schon klar, aber vielleicht gibt es ja noch Optimierungsvorschläge.
Hier nun der Code:

Sub Widerstand_ermitteln()
Zieldatei = "Ergebnisse_Auswertung_leer.xls"
Verbaut = False
For i = 2 To ActiveSheet.Range("a65536").End(xlUp).Row
For j = 0 To 39
Suchstring = Mid(Cells(i, 5), j * 4 + 1, 4)
HiByte = Val("&H" & Left$(Suchstring, 2))
LowByte = Val("&H" & Right$(Suchstring, 2))
If HiByte  255 And LowByte  255 Then
Widerstand = Widerstandsberechnung(HiByte, LowByte)
Verbaut = True
End If
If Verbaut = True Then
With Cells(i, 8 + j)
.NumberFormat = "0.00"
If Widerstand 



Function Widerstandsberechnung(HiB As Byte, LowB As Byte) As Double
Widerstand = (((HiB * 256 + LowB) * 6.875) / 700) - 0.15
Widerstandsberechnung = Widerstand
End Function


So, nun könnt ihr mal eure Köpfe rauchen lassen. Ich bin mal gespannt was ihr für Vorschläge habt.
Gruß
Jürgen

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

Betreff
Datum
Anwender
Anzeige
AW: Laufzeit des Makros optimieren
19.09.2008 09:56:37
Rudi
Hallo,
1. Application.ScreenUpdating=False würde schon mal helfen.
2. Die Formatierungen (Numberformat, Interior.Colorindex) würde ich zum Schluss auf einen Schlag erledigen.
3. Der Sprung in die Function frisst Zeit. Berechnung besser direkt im Makro.
4. Wenn du die Ergebnisse erst alle in ein Array (1 to 60000, 1 to 40) schreibst, und am Ende das Array auf einen Schlag in das Blatt, geht's auch erheblich schneller.
Gruß
Rudi
AW: Laufzeit des Makros optimieren
19.09.2008 10:04:26
Ladengast
Hallo Rudi,
vielen Dank für die Anregungen. Ich werde Deine Vorschläge gleich mal umsetzen und mich dann nochmals melden.
Gruß
Jürgen
Anzeige
AW: Laufzeit des Makros optimieren
19.09.2008 12:20:00
kgurr
Hallo,
eine weitere hilfreiche Funktion beim schreiben in das Tabellenblatt, ist die automatische Berechnung auszuschalten. Das bringt nach meiner Erfahrung sehr viel ...
Application.Calculation = xlCalculationManual
schreiben ...
Application.Calculation = xlCalculationAutomatic
Grüsse kgurr
AW: Laufzeit des Makros optimieren
19.09.2008 10:03:37
Tobias
Hallo Jürgen!
Entferne alle(!) Cells-Aufrufe innerhalb der Schleifen. Speicher die Ergebnisse in Datenfelder und schreibe den Inhalt des Datenfelds nach allen Schleifen zurück in die Exceltabelle.
Ein ähnliches Problem hatte vor Kurzem Chris:
https://www.herber.de/forum/archiv/1008to1012/t1008815.htm
Wie man viele Zellen schnell einliest und schreibt steht auch hier:
Nicht mehr ganz aktuell, da schon 10 Jahre alt: http://www.avdf.com/apr98/art_ot003.html

How do you read in/write out lots of cells at once?
'to read in
Dim A as Variant 'MUST be variant, no brackets
A = Range("SomeRange").Resize(10,20) 'reads 10x20 array starting at range SomeRange
'(NB I've used Resize above but you can specify a range of cells any way you want)
'to write back to sheet
Range("SomeRange").Resize(10,20) = A
'A can be any data type but MUST be two dimensional even if you are only writing one
'column or row - first dimension is used for rows, and the second for columns
'this can be slow - see third question below for workaround..


Ich habe das ganze auch mal ausgiebig getestet: http://schmid.tobi.googlepages.com/variantdatenimport
Aber auch der Artikel müsste mal überarbeitet werden...
Gruß, Tobi
http://www.vba-blog.de/

Anzeige
AW: Laufzeit des Makros optimieren
19.09.2008 10:15:07
Gerd
Hallo Jürgen,
lagere die Werte in Datenfelder aus, stelle die Berechnungen dort an,
schreibe die Ergebnisse in weitere Datenfelder u. diese en block ins Zielblatt zurück.
Aus Stunden werden dann Sekunden, zumindest Minuten,
nachdem dein Kopf etwas "geraucht" hat. :-)
Nur ergänzend dann noch "Get More Speed"
Gruß Gerd
Laufzeit des Makros optimieren - Ergebnis
19.09.2008 13:09:00
Ladengast
Hallo zusammen,
ein großes, dickes Lob und Dankeschön für die Anregungen zur Codeoptimierung. Nach der Speicherung und Verarbeitung der Daten in einem Array und anschließendem Zurückschreiben ging die Laufzeit des Makros von mehreren Stunden zurück auf etwa 1 Minute!!!!!
Absolut genial und nochmals vielen Dank.
Gruß
Jürgen
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige