Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1092to1096
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 Ausführungsdauer verkürzen?

Code Ausführungsdauer verkürzen?
Lorenz
Hallo Excelianer!
Laut untenstehenden Code wird aus 31 Blättern mit Namen 1., 2., 3., ...... die jeweiligen Summen gebildet, in Abhängigkeit von dem Kriterium in Spalte A. Es sind aber die Einträge in den einzelnen Blättern unter umständen nicht in derselben Zeile. Darum die "verzwickte" Formel. Leider braucht die Berechnung (Ausführung des Codes) bis zu 120 Sekunden. Läßt sich mit der Art wie dies von mir "fabriziert" wurde eventuell verbessern?
Sub Berechnen()
getMoreSpeed True
Range("B6:BD89") = ""
With Range("B2:BD2")
.FormulaR1C1 = "=MySPALTE"
.Value = .Value
End With
With Range("V2")
.FormulaR1C1 = "=MySPALTE_2"
.Value = .Value
End With
With Range("B6:B89,D6:D89,N6:N89,V6:V89,Y6:Y89,Z6:Z89,AA6:AA89,AB6:AB89,AC6:AC89,AE6:AE89,AF6: _
AF89,AG6:AG89,AH6:AH89")
.FormulaLocal = "=SUMME(SUMMEWENN(INDIREKT(""'""&{""1."".""2."".""3."".""4."".""5."".""6.""."" _
7."".""8."".""9."".""10."".""11."".""12."".""13."".""14."".""15."".""16."".""17."".""18."".""19."".""20."".""21."".""22."".""23."".""24."".""25."".""26."".""27."".""28."".""29."".""30."".""31.""}&""'!$A:""&MySpalte);$A6;INDIREKT(""'""&{""1."".""2."".""3."".""4."".""5."".""6."".""7."".""8."".""9."".""10."".""11."".""12."".""13."".""14."".""15."".""16."".""17."".""18."".""19."".""20."".""21."".""22."".""23."".""24."".""25."".""26."".""27."".""28."".""29."".""30."".""31.""}&""'!""&MySpalte&"":""&MySpalte&"""")))"
With .CurrentRegion
.SpecialCells(Type:=xlCellTypeFormulas, Value:=xlErrors).Value = 0
.Value = .Value
End With
End With
With Range("AI6:AI89,AJ6:AJ89,AK6:AK89,AL6:AL89,AM6:AM89,AN6:AN89,AO6:AO89,AP6:AP89,AQ6:AQ89, _
AR6:AR89,AS6:AS89,AT6:AT89,AU6:AU89,AV6:AV89,AW6:AW89,AX6:AX89,AY6:AY89,AZ6:AZ89,BA6:BA89,BB6:BB89,BD6:BD89")
.FormulaLocal = "=SUMME(SUMMEWENN(INDIREKT(""'""&{""1."".""2."".""3."".""4."".""5."".""6."".""7. _
"".""8."".""9."".""10."".""11."".""12."".""13."".""14."".""15."".""16."".""17."".""18."".""19."".""20."".""21."".""22."".""23."".""24."".""25."".""26."".""27."".""28."".""29."".""30."".""31.""}&""'!$A:""&MySpalte);$A6;INDIREKT(""'""&{""1."".""2."".""3."".""4."".""5."".""6."".""7."".""8."".""9."".""10."".""11."".""12."".""13."".""14."".""15."".""16."".""17."".""18."".""19."".""20."".""21."".""22."".""23."".""24."".""25."".""26."".""27."".""28."".""29."".""30."".""31.""}&""'!""&MySpalte&"":""&MySpalte&"""")))"
With .CurrentRegion
.SpecialCells(Type:=xlCellTypeFormulas, Value:=xlErrors).Value = 0
.Value = .Value
End With
End With
getMoreSpeed False
End Sub
Hinter MySpalte steht folgende benannte Formel: "=LINKS(ADRESSE(1;MIN(SPALTE());4);1+(MIN(SPALTE())>26))" (wird nur die Zeilenbuchstaben ausgegeben).
getMoreSpeed =
Sub getMoreSpeed(bDoIt As Boolean)
Application.ScreenUpdating = Not (bDoIt)
Application.EnableEvents = Not (bDoIt)
Application.DisplayAlerts = Not (bDoIt)
End Sub
?Hat vielleicht jemand ne Idee?
Danke & Gruß
Lorenz

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

Betreff
Benutzer
Anzeige
AW: Code Ausführungsdauer verkürzen?
31.07.2009 00:49:33
Daniel
Hi
mal so auf die Schnelle, was du probieren könntest, wäre erst die Formeln durch Werte zu ersetzen und dann erst die Fehler durch 0., also
With .CurrentRegion
.Value = .Value
.SpecialCells(Type:=xlCellTypeConstants, Value:=xlErrors).Value = 0
End With

so wie du es machst, könnte es sein, daß die Formeln nochmal erneut durchgerechnet werden, weil INDIREKT eine volatile Funktion ist, dh. sie wird bei jeder Änderung im Tabellenblatt neu berechnet.
um zu beurteilen, ob sich bei der Formel nochwas optimiern liesse, müsste man deine Datei und die beabsichtigte Aufgabenstellung besser kennen.
so wie du die Aufgabe gelöst hast, kannst du das GetMoreSpeed auch weglassen, höchstens das EnableEvents ist wirksam, aber nur falls du auch Eventgesteuerte Makros hast.
vielleicht bringts noch was, die Range-Strings zu vereinfachen, dh aus "AI6:AI89,AJ6:AJ89,AK6:AK89,AL6:AL89,AM6:AM89" kann man auch "AI6:AM89" machen.
obs damit schneller wird, weiß ich nicht, aber auf jeden Fall wird der String kürzer und Einfacher zu lesen.
Gruß, Daniel
Anzeige
AW: Code Ausführungsdauer verkürzen?
31.07.2009 01:25:09
Lorenz
Hallo Daniel!
Mit "AI6:AM89" dauerts gleich um 15 sec.. länger.
Gleiche Laufzeit mit .value & .SpecialCells....... u. umgekehrt.
Danke fürn Tipp & Grüße
Lorenz
AW: Code Ausführungsdauer verkürzen?
01.08.2009 16:04:13
Daniel
Hi
wieviele Zeilen haben denn deine Tabellen?
SummeWenn ist nunmal ne langsame Formel, Indirekt auch und wenn jedesmal noch die Zeilenzahl pro Spalte berechnet wird, dann dauerts halt.
falls es dich beruhigt, ich hab auch schon Berechnungen gemacht, die ich über Nacht laufen lassen musste.
Gruß, Daniel
AW: Code Ausführungsdauer verkürzen?
31.07.2009 09:04:11
Tino
Hallo,
Du könntest mal versuchen in der Sub getMoreSpeed die Berechnung noch auf manuell zu stellen.
Ob es dadurch etwas schneller wird, kann ich dir nicht versprechen, habe Deine Tabelle nicht nachgebaut und getestet.
Sub getMoreSpeed(bDoIt As Boolean)
Static iCalc As Integer
With Application
If bDoIt Then iCalc = .Calculation
.ScreenUpdating = Not (bDoIt)
.EnableEvents = Not (bDoIt)
.DisplayAlerts = Not (bDoIt)
.Calculation = IIf(bDoIt, xlCalculationManual, iCalc)
End With
End Sub

Gruß Tino
Anzeige
AW: Code Ausführungsdauer verkürzen?
01.08.2009 06:59:13
Lorenz
Hallo Tino!
Die "AutoBerechnung" ist wegen umfangreichster Berechnungen sowieso deaktiviert. Somit hat sich der Tipp in Luft aufgelöst.
Trotzdem Danke für die Info & Grüsse
Lorenz

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige