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

Code Geschwindigkeit abhängig von Filegröße?

Code Geschwindigkeit abhängig von Filegröße?
17.01.2017 09:53:52
Filegröße?
Hallo,
ich habe mir eine VBA funktion in einem stand - alone file geschrieben. Dieses Makro läuft in ungefähr 10 Sekunden durch und tut was es soll.
Jetzt will ich dieses Funktion in eine anderes, größeres File, in dem auch andere funktionen vorhanden sind, verschieben und dort durchlaufen lassen. Das funktioniert immer noch, aber ist extrem langsam. In 10 Sekunden werden nur sehr wenige Werte berechnet (100 statt 9000). Weiß jemand woran das liegen könnte?
Sub myFunction()
'Get current state of various Excel settings; put this at the beginning of your code
Dim screenUpdateState As Variant, statusBarState As Variant, eventsState As Variant,  _
DisplayPageBreaks As Variant
screenUpdateState = Application.ScreenUpdating
statusBarState = Application.DisplayStatusBar
eventsState = Application.EnableEvents
DisplayPageBreaks = ActiveSheet.DisplayPageBreaks 'note this is a sheet-level setting
'turn off some Excel functionality so your code runs faster
Application.ScreenUpdating = False
Application.DisplayStatusBar = False
Application.EnableEvents = False
ActiveSheet.DisplayPageBreaks = False 'note this is a sheet-level setting
Dim countI As Integer
With Sheets("Tabelle1")
Range(Cells(4, "Y"), Cells(9000, "AB")) = 0
.Cells(1, 1).Clear
For countI = 4 To 9000
If (Evaluate("=MAX(" & Cells(countI, 20).Address(0, 0) & ":" & Cells(countI, 22). _
Address(0, 0) & ")") > 0) Then
If Cells(countI, 20) > 0 Then
If Cells(countI, 21).Value = 0 And Cells(countI, 22) = 0 Then
Cells(5, "C") = Cells(countI, 20)
Cells(6, "C") = Cells(countI, 23)
Cells(7, "C") = 0
Cells(countI, "Y") = Cells(17, "C")
Cells(countI, "Z") = Cells(23, "C")
Cells(countI, "AA") = Cells(31, "C")
Cells(countI, "AB") = Cells(32, "C")
ElseIf Cells(countI, 21).Value > 0 Then
Cells(5, "C") = Cells(countI, 20)
Cells(6, "C") = Cells(countI, 23)
Cells(7, "C") = Cells(countI, 21)
Cells(countI, "Y") = Cells(17, "C")
Cells(countI, "Z") = Cells(23, "C")
Cells(countI, "AA") = Cells(31, "C")
Cells(countI, "AB") = Cells(32, "C")
End If
If Cells(countI, 22).Value > 0 Then
Cells(5, "K") = Cells(countI, 20)
Cells(6, "K") = Cells(countI, "W")
Cells(7, "K") = Cells(countI, 22)
Cells(countI, "Y") = Cells(17, "K")
Cells(countI, "Z") = Cells(23, "K")
Cells(countI, "AA") = Cells(31, "K")
Cells(countI, "AB") = Cells(32, "K")
If Cells(countI, "Z")  0 Then
Cells(6, "G") = Cells(countI, 22)
Cells(countI, "Y") = Cells(13, "G")
Cells(countI, "Z") = 0
Cells(countI, "AA") = Cells(31, "G")
Cells(countI, "AB") = 0
End If
End If
End If
Next countI
'after your code runs, restore state; put this at the end of your code
Application.ScreenUpdating = screenUpdateState
Application.DisplayStatusBar = statusBarState
Application.EnableEvents = eventsState
ActiveSheet.DisplayPageBreaks = DisplayPageBreaks 'note this is a sheet-level setting
Cells(1, 1).FormulaLocal = "=SUMME(AA:AB)*10^-6"
End With
End Sub

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

Betreff
Datum
Anwender
Anzeige
AW: Code Geschwindigkeit abhängig von Filegröße?
17.01.2017 09:57:19
Filegröße?
Vielleicht als zusatz info:
ist nur die stand-alone arbeitsmappe offen, läuft die Funktion schnell durch.
Öffne ich dazu das zweite, große fiel und versuche dieselbe funktion wieder im stand-alone auszuführen, ist sie schon wieder langsam. Hat das mit der Filegröße zu tun (das große file ist 85 Mb groß).
AW: Code Geschwindigkeit abhängig von Filegröße?
17.01.2017 10:03:59
Filegröße?
Hi
wenn deine Datei noch Formeln enthält, dann könnte jedes Cells(...) = ? eine Neuberechnung der Formeln auslösen, wenn diese Wertänderung in einem Zellbereich passiert der von eine anderen Formel referenziert wird oder wenn eine Formel eine volatile Funktion enthält (Indirekt, Bereich.Verschieben, Heute, Jetzt, Zufallszahl, -Bereich).
das kostet natürlich Zeit.
du könntest zur Beschleunigung noch die automatsische Neuberechnung der Formeln ausschalten:
Application.Calculatioin = xlcalculationmanual
Beachte: diese Einstellung muss bei Makroende wieder auf den ursprünglichen Stand gesetzt werden, so wie du es für die anderen Einstellungen ja auch machst.
Gruß Daniel
Anzeige
AW: Code Geschwindigkeit abhängig von Filegröße?
17.01.2017 10:16:40
Filegröße?
Hallo Daniel,
vielen Dank. Das habe ich schon geprüft. Das hilft, aber ist nicht wirklich ausschlaggebend.
Das Probelm ist ja auch eigentlich, dass die Routine in einer kleinen Arbeitsmappe mit wenigen Arbeitsblättern schnell läuft und in einer großen Arbeitsmappe mit vielen Arbeitsblättern/Funktionen langsam.
Berechnungen, Blattzugriffe vs. Array
17.01.2017 14:29:21
Michael
Hi,
abgesehen von Daniels Vorschlag ist in meinen Augen die Funktion der Tabelle entscheidend: was passiert zwischen den beiden Blöcken

Cells(5, "C") = Cells(countI, 20)
Cells(6, "C") = Cells(countI, 23)
Cells(7, "C") = 0
' und
Cells(countI, "Y") = Cells(17, "C")
Cells(countI, "Z") = Cells(23, "C")
Cells(countI, "AA") = Cells(31, "C")
Cells(countI, "AB") = Cells(32, "C")

sind die unteren Ergebnisse abhängig von den oberen? Sprich: steht in C17 etwa =C5+C6 oder sonst irgendeine Formel?
Wenn nicht, kann man das Blatt in ein Array stecken, die Zuweisungen dort vornehmen und das Array zurückschreiben (dann sind alle "Verbesserungen" wie Screenupdating unnötig, außer vielleicht .enableevents, falls ein _Change-Event im Blatt vorhanden sein sollte).
Falls doch, könnte man auch ein Array nehmen, müßte diese paar Formeln aber direkt in VBA verrechnen: dazu müßte man eine Beispieltabelle haben.
Schöne Grüße,
Michael
Anzeige
AW: Berechnungen, Blattzugriffe vs. Array
17.01.2017 16:58:18
Raimund
Hallo Michael,
Vielen Dank für deine Hilfe.
In C17/C23/C31/C32 stehen verketet verschiedene polynome, die von C5,C6 und C7 abhängig sind, d.h. diese Berechnungen in VBA umzusetzen ist äußerst aufwändig.
Was ich jetzt gemacht habe, ist die Ergebnisse in ein Array zu speichern und dieses dann nur am Schluss einzufügen.
Das ursprüngliche Problem bleibt aber bestehen....nämlich dass die funktion im Stand alone schnell läuft, in dem großen File dann unnötig lange braucht.
AW: Berechnungen, Blattzugriffe vs. Array
17.01.2017 19:39:51
Michael
Hi,
also, ein Polynom in VBA zu berechnen ist doch keine Hexerei - hm, naja, "verkettet"...
Wegen "einmal" würde ich den Aufwand nicht betreiben, aber falls die Berechnungen oft benötigt werden, könnte es sich schon rentieren: wenn man die Formeln schon mal anschaut, ergeben sich vielleicht auch algebraische Optimierungen...
Lad halt mal ne anonymisierte Datei hoch, mit allen Formeln und ein paar Spieldaten - jetzt haste mich neugierig gemacht.
Das Problem sind, wie bereits von Daniel bemerkt, die vielen Zellzugriffe. Trotz manueller .calculation ist Excel anscheinend nicht in der Lage, eine weitere, geöffnete Tabelle im Hintergrund *auch nicht* zu berechnen - das Problem kenne ich.
Kurzum: entweder Du machst die große Tabelle zu oder Du rechnest ausschließlich innerhalb des Arrays, zwischendrin wird es vermutlich nicht viel geben.
Gruß,
Michael
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige