Hallo Holger,
Danke für die Mühe. Logisch, warum soll die Schleife Berechnungen durchführen, die ich auch im Vorfeld machen kann. Leider ist der Zeitgewinn nicht so bedeutend wie erwartet. Deine Tips habe ich trotzdem eingebaut.
Der Vollständigkeit halber:
Ich löse das Problem jetzt zusätzlich so. Ich markiere die Startzellen weiterhin von Hand (Beispielsweise mit einer Hintergrundfarbe) und baue mir um das Makro eine Schleife, die die Dateien nach und nach öffnet, die markierte Zelle sucht, den Code abarbeitet und die Änderungen speichert. Da hat der Rechner eine Nacht lang zu tun und ich frage die Ergebnisse am Morgen ab.
Danke noch mal.
Leon
Holger schrieb am 30.11.2009 13:44:53:
Hallo Leon,
vermeide unnötige Berechnungen i der Scheife, versuche Potenzen zu vermeiden (Quadrieren geht mit * schneller, vermutlich auch Wurzelziehen mit Sqr), verwende kürzere Vaiablennamen in der Schleife (vielleicht bilde ich mir hier nur ein, dass das schneller geht). Z.B.:
a = 2
h = 15
s = 16
d = 235.2
r = 117.6
d0 = 18.4
b = r - d0
c = 2 * d
Set Startzelle = Application.InputBox("Markieren Sie die Startzelle", Type:=8)
'Application.ScreenUpdating = False
intZeileQ = Startzelle.Row
intSpalte = Startzelle.Column
For i = intZeileQ To Cells(Rows.Count, intSpalte).End(xlUp).Row
Cells(i, h).Value = b - Cells(i, a).Value
x = Cells(i, h).Value
If X <= r Then
Cells(i, s).Value = 2 * Sqr(2 * r * x + x * x)
Else
Cells(i, s).Value = c - 2 * Sqr(2 * r * x + x * x)
End If
'Application.ScreenUpdating = True
Next i
Ich bin gespannt, welche Verkürzung du erhälst.
Gruß
Holger
Leon schrieb am 30.11.2009 12:54:51:
Hi,
ich habe ein Makro das in einer Schleife für mehrere 100.000 Zeilen in 20 Spalten Berechnungen durchführt. Die Folge ist, dass das Makro fast 5 Minuten läuft. Der Startpunkt des Makros wird von Hand festgelegt (Startzelle).
Wie kann ich das Makro schneller machen?
Vielleicht kommt man ja irgendwie ohne Schleife aus?
Als Beispiel habe ich die Berechnung für 2 Spalten eingefügt.
Danke
Leon
Sub Schleife()
Dim Startzelle As Range
Dim intZeile, intZeileQ As Integer
Dim intSpalte As Integer
Dim A, h, s As Integer
A = 2
h = 15
s = 16
d = 235.2
r = 117.6
d0 = 18.4
Set Startzelle = Application.InputBox("Markieren Sie die Startzelle", Type:=8)
'Application.ScreenUpdating = False
intZeileQ = Startzelle.Row
intSpalte = Startzelle.Column
For intZeile = intZeileQ To Cells(Rows.Count, intSpalte).End(xlUp).Row
Cells(intZeile, h).Value = r - d0 - Cells(intZeile, A).Value
If Cells(intZeile, h).Value <= r Then
Cells(intZeile, s).Value = 2 * (r ^ 2 - (r - Cells(intZeile, h).Value) ^ 2) ^ 0.5
Else
Cells(intZeile, s).Value = d + d - (2 * (r ^ 2 - (r - Cells(intZeile, h).Value) ^ 2) ^ 0.5)
End If
'Application.ScreenUpdating = True
Next intZeile
End Sub
|