Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1588to1592
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

Schleifen und Geschwindigkeit

Schleifen und Geschwindigkeit
07.11.2017 11:14:37
Rookie
Hallo Liebe VBA-Profis,
Ich habe wieder mal ein kleines Problem bei dem ihr mir vielleicht weiterhelfen könnt:
Ich habe eine Schleife programmiert, die im Grunde genau das macht was sie machen soll. Das Ergebnis ist immer richtig. Mein Problem ist nur die Geschwindigkeit. Bei einem Tabellenblatt mit bis zu 3000 Zeilen kann es ganz schön lange dauern, bis das Makro durchgelaufen ist.
https://www.herber.de/bbs/user/117491.xlsm
Habt ihr vielleicht eine Idee, wie ich die Performance hier steigern könnte?
Vielen lieben Dank!
Gruß
Stefan

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

Betreff
Datum
Anwender
Anzeige
AW: Schleifen und Geschwindigkeit
07.11.2017 11:35:40
EtoPHG
Hallo,
Das auch noch ins Modul:
Sub GetMoreSpeed(Optional ByVal Modus As Boolean = True)
Static intCalculation as Integer
If Modus = True Then intCalculation = Application.Calculation
With Application
.ScreenUpdating = Not Modus
.EnableEvents = Not Modus
.Calculation = IIf(Modus = True, xlManual, intCalculation)
.Cursor = IIf(Modus = True, 2, -4143)
End With
End Sub
Vor deiner ersten Codezeile:
getMoreSpeed

Vor deinem End Sub:
getMoreSpeed False
Achtung: Falls dein Code irgendwo zwischen den beiden Aufrufen abgebrochen wird, musst du programmatisch (oder über das Direktfenster) nochmals den letzten Befehl (getMoreSpeed False) aufrufen.
Gruess Hansueli
Anzeige
AW: Schleifen und Geschwindigkeit
07.11.2017 13:42:22
Rookie
Hallo Hansueli,
das ist ja der Hammer!! Funktioniert wunderbar!!! Vielen herzlichen Dank!
Kannst du mir noch kurz erklären, was das genau passiert? Wird die Prozedur hier irgendwie ausgelagert?
Gruß
Stefan
AW: Schleifen und Geschwindigkeit
07.11.2017 14:22:20
Daniel
Hi
jedes mal, wenn du eine Zelle änderst, muss Excel eine Vielzahl von Aktionen ausführen.
Es muss beispielsweise die Änderung auf dem Bildschirm anzeigen, es muss prüfen, ob es irgendwo in einer geöffneten Exceldatei Zellen gibt, die Formeln enthalten die sich auf diese Zelle beziehen und neu berechnet werden müssen und wenn ja, werden diese Formeln auch neu berechnet.
Es muss geprüft werden, ob es ein Eventmakro gibt, welches auf die ausgeführte Aktion reagieren muss (n der Regel das Change-Event) und wenn ja, müssen sie ausgeführt werden.
du siehst, es gibt für Excel jede Menge zu tun, wenn du einen Zellwert änderst und das braucht alles viel Zeit.
jetzt gibt es zwei Ansätze, um diese Bremse auszuschalten:
a) man deaktiviert diese Aktionen so weit wie möglich und lässt sie erst am Ende des Makros ausführen.
das ist der Ansatz von Hansueli
b) man versucht, die Anzahl der Zellzugriffe so weit wie möglich zu reduzieren um damit zu erreichen, dass Excel diese Aktionen weniger häufig und möglichst für viele Zellen gleichzeitig in einem Schritt ausführen kann.
dh wenn du schreibst:
Range("A1").Value = 1
Range("A2").Value = 1

dann erzeugt das für Excel einen doppelt so hohen Aufwand, wie wenn du schreibst:
Range("A1:A2").value = 1

weil Excel die o.g. Aktionen im obigen Fall 2x ausführen muss, um unteren Fall jedoch nur einmal für beide Zellen gleichzeitig.
wenn du das konsequent machst, sollte der Ablauf eigentlich so schnell werden, dass das "getMoreSpeed" keine große Verbesserung der Durchlaufzeit bringt.
Gruß Daniel
Anzeige
AW: Schleifen und Geschwindigkeit
07.11.2017 12:52:16
Daniel
Hi
du hast in dem Code mehrfach zwei in einander geschachtelte Schleifen.
Die solltest du mal überprüfen, ob die überhaupt notwendig.
Außerdem solltest du bei den Doppelschleifen alle Aktionen in der inneren Schleife überprüfen, ob diese nicht in die äußere Schleife gehören.
Hinweiszeichen ist immer, ob der Schleifenzähler der inneren Schleife eine Rolle bei der Aktion spielt, bzw verändert sich die Aktion während des Schleifendurchlaufs.
Wenn nein, gehört die aus der Schleife raus, denn wenn die Aktion in der Schleife immer genau gleich ausgeführt wird, muss man sie nicht wiederholt ausführen lassen sondern einmal reicht.
Überflüssig sind auch solche Schleifen, die du durch eine Formel ersetzen kannst.
Wenn du das per Formel machst, kannst du alle Zellen in einem Schritt bearbeiten.
In der Schleife wird jede Zelle einzeln bearbeitet, was wesentlich aufwendiger ist.
(Wenn du einkaufen gehst, dann fährst du ja auch nur 1x zum Supermarkt und kaufst dort alle zusammen ein und bezahlst alles zusammen, wenn du für jeden Artikel einzeln gehst, dauert es viel länger bis du alles hast.
Beispiel:
Langsam ist:
With ThisWorkbook.Sheets("SAP_Adjusted")
For c = 2 To i
If .Range("D" & c).Value = "keine Übereinstimmung" Then
.Range("E" & c).Value = "kein Wert"
Else
.Range("E" & c).Value = .Range("D" & c).Value * ThisWorkbook.Sheets("SAP_Import").Range( _
"H" & c).Value
End If
Next
End With 
geht viel schneller so:
With ThisWorkbook.Sheets("SAP_Adjusted").Range("E2:E" & i")
.FormulaR1C1 = "=IF(RC4=""keine Übereinstimmung"",""kein Wert"",RC4*'SAP_Import'!RC8)"
.Formula = .Value
end with

das ist nicht nur kürzer und schneller, sondern lässt sich auch viel angenehmer in Einzelstepmodus testen.
Gruß Daniel
Anzeige
AW: Schleifen und Geschwindigkeit
07.11.2017 13:50:29
Rookie
Hallo Daniel,
vielen lieben Dank für deinen Hinweis, ich werde es gleich prüfen und kürzer machen!
Gruß
Stefan

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige