2.9k Aufrufe
Gefragt in Tabellenkalkulation von
Hallo ,

ich habe Makro geschrieben, dass allerdings fruchtbar langsam ist und hätte gerne die Laufzeit verringert.

Ich frage einfach mal allgemein: Worauf ist dabei speziell zu achten, bzw. wo liegen programmtechnisch tendenziell die größten Zeitfresser begraben?

Konkret: Eine Tabelle mit Tageswerten soll bearbeitet werden,
und ich hab dafür einige
"Arrays(366) As Double"
und einige
"Arrays(25) as Double".
verwendet.
Wird dadurch Zeit gespart oder verschwendet? (zB Speicherelevanz?)

Und: Wie kann ich am schnellsten aus einer Zahlenreihe (Spalte oder Array) eine Zahl aussuchen, die einer Vorgabe am nähesten kommt? Geht das irgend elegant mit For Each o.ä.?



Gruß
[list] Primut[/list]

9 Antworten

0 Punkte
Beantwortet von saarbauer Profi (15.6k Punkte)
Hallo,

die höhere Rechengenauigkeit braucht zwar mehr Zeit, aber ob dass das Problem ist wage ich zu bezweifeln. Ich vermute eher irgendwelche Schleifen die hunderte Male durchlaufen werden.

Diese Sache vermute ich, da keiner von uns den Aufbau der Makros kennt.

Zudem solltest du dir überlegen ob du wirklich die erhöhte Genauigkeit brauchst, in den meisten Fällen reicht die normale Genauigkeit aus. Dieses jedoch kannst nur du entscheiden.

Gruß

Helmut
0 Punkte
Beantwortet von
Hallo Helmut,

ja, du hast Recht. Variablendeklaration sind nicht meine Stärke.
Single reiht natürlich auch - hatte ich irgendwie gar nicht dran gedacht. Das könnte sich dann bei größeren Array wohl schon bemerkbar machen.

Habe gerade noch einen andere Seite mit Beispielen gefunden und werde diese mal durcharbeiten.

Klar habe ich zwangsläufig Schleifen in Schleifen, werde das jetzt aber noch einmal nach Möglichkeit optimieren.


Thanks
[list]Primut[/list]
0 Punkte
Beantwortet von rudi4ad Mitglied (167 Punkte)
Hallo Primut

Und: Wie kann ich am schnellsten aus einer Zahlenreihe (Spalte oder Array) eine Zahl aussuchen, die einer Vorgabe am nähesten kommt?

www.online-excel.de/fom/fo_read.php?f=1&bzh=-1&h=42975&ao=1
0 Punkte
Beantwortet von
Besten Dank ,

ich habe mein Problem jetzt gelöst. Die Rechenzeit von 1,5 h auf ein paar Sekunden reduziert mit folgenden Verbesserungen:
[list]- passende Variablendeklaration

- Werte aus den Tabellenblätter direkt ohne Blattauswahl einlesen

- den Vergleich nicht per Schleife sondern per Worksheetfunktion (zB Match) gelöst

- das Werteübertragen vom Array in die Zellen nicht durch Schleife mit direkter
Zellenauswahl sondern per Feldübertragung vom Array mit den Daten auf den ausgewählten Range.[/list]

Den deutlichsten Zeitgewinn haben die beiden letzten Punkte gebracht.
0 Punkte
Beantwortet von
Also, ich kenn den Aufbau auch nicht, aber such doch mal im Netz nach Programmen die dir helfen.

Suchen
0 Punkte
Beantwortet von
"Blattauswahl" und "Zellenauswahl"

Oh ja! Sicherlich die typischen SELECT Schritte aus übernommenen Makroaufzeichnungen ;o)

Das sind die tödlichsten Sachen in Excel-Makros. Und bei Application.ScreenUpdating = True lassen die den Bildschirm so schön mitmachen ;o)

Gruß, Winuser
0 Punkte
Beantwortet von nighty Experte (6.6k Punkte)
hi ^^

zur ergaenzung

gruss nighty


Global Scup As Boolean
Global Ebes As Boolean
Global Cclt As Integer
Option Explicit

Sub Ergaenzung()
Scup = Application.ScreenUpdating
Ebes = Application.EnableEvents
Cclt = Application.Calculation
Call EventsOff
Rem dein code
Call EventsOn
End Sub

Public Sub EventsOff()
With Application
.ScreenUpdating = False
.EnableEvents = False
.Calculation = xlCalculationManual
End With
End Sub
Public Sub EventsOn()
With Application
.ScreenUpdating = Scup
.EnableEvents = Ebes
.Calculation = Cclt
End With
End Sub
0 Punkte
Beantwortet von
Hey Nighty,

das ist doch mal eine sehr schöne, interessante Ergänzung.
Besten Dank, kann ich bei späteren Geschichten bestimmt sehr gut gebrauchen.


@Winuser Was wolltest du mir eigentlich mit diesem Kommentar sagen???

Nein, ich habe keine Makroaufzeichnungen benutzt! Aber ich programmiere nicht jeden Tag Makros und daher fehlt mir etwas die Routine. Deswegen war mir einfach der Befehl

Dim var(6 To 8765, 1 To 13) As Variant

With Worksheets("XXX")
.Range(.Cells(6, 1), .Cells(8765, 5)) = var
End With

nicht so geläufig. Daher meine Frage.
114.000 Werte einzeln in Zellen zu schreiben dauert halt....

Gruß
[list] Primut[/list]
0 Punkte
Beantwortet von
Sorry, Schreibfehler:

.Range(.Cells(6, 1), .Cells(8765, 5)) = var

ist natürlich
.Range(.Cells(6, 1), .Cells(8765,13)) = var
...