AW: STIMMT!!!
16.05.2008 03:21:14
ingUR
Hallo, Jenny,
in Deinem Beispiel wird ein großer Teil der Zeit auch für das Setzen der Zufallszahlen beansprucht werden.
Dennoch läßt die Funktionalität der Formelüberwachung mit schrittweiser Auswertung einer Formel die Vermutung zu (hier mit EXCEL 2003 den Versuch durchgeführt), dass die WENN-DANN-SONST-Struktur den SONST-Teil nicht ausführt, wenn der Wahrheitswert der Bedingung WAHR ist. Das deckt sich mit den Beobachtungen von Dir und Franz.
Um diesen Sachverhalt etwas genauer zu prüfen, setze ich eine für den Beispielfall geschriebenen VBA-Prozedur ein, die bei abgeschalteter "Automatischen Berechnung" und Bildschirmaktuallisierung in mehreren Durchläufen (nLoops) mehrmals hintereinander (nTests) die Berechnung auslöst (analog zu F9), so dass die reinen gemittelte Rechenzeiten für die Berechnung des Tabellenblattes, sowohl für die ungefüllte als auch für die gefüllte Steuerungszelle $A$1 gegenübergestellt werden können.
| A | B | C | D |
1 | 1 | 5015 | 5,83154212 | 5,53942224 |
Formeln der Tabelle |
Zelle | Formel | B1 | =WENN($A$1="";"";SUMMENPRODUKT((C1:C$20000>5)*(D1:D$20000<5))) |
|
Excel Tabellen im Web darstellen >> Excel Jeanie HTML 4
Die Formel in Zelle B1 habe ich bis zur Zeile 20 in der gleichen Spalte gezogen. Die Zellen C1 bis D20000 enthalten die Werte, die durch eine mit 10 multiplizierte Zufallszahlzahl je Zelle als statischen Wert enthalten.
Der Programmcode der Prozedur:
Sub TestWennDannSonst()
Dim t0 As Double, t1 As Double, t2 As Double, tt As Double
Dim sumt0 As Double, sumt1 As Double, sumt2 As Double
Dim i As Long, l As Integer
Dim nTests As Long, nLoops As Long
nTests = 1000
nLoops = 100
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
For l = 1 To nLoops
t0 = Now()
For i = 1 To nTests
Next
tt = Now()
sumt0 = sumt0 + (tt - t0)
Cells(1, 1) = ""
t1 = Now()
For i = 1 To nTests
Application.Calculate
Next
tt = Now()
sumt1 = sumt1 + (tt - t1)
Cells(1, 1) = 1
t2 = Now()
For i = 1 To nTests
Application.Calculate
Next
tt = Now()
sumt2 = sumt2 + (tt - t2)
Next
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
MsgBox "t0mittel (Leerschleife) = " & 24 * 60 * sumt0 / nLoops / nTests & vbLf & _
"t1mittel (Zelle A1 leer) = " & 24 * 60 * (sumt1 - sumt0) / nLoops / nTests & _
vbLf & _
"t2mittel (Zelle A1 gefüllt) = " & 24 * 60 * (sumt2 - sumt0) / nLoops / nTests & _
vbLf & _
"Faktor =" & Format((sumt2 - sumt0) / (sumt1 - sumt0) - 1, "0.00%")
End Sub
t0mittel ist die Zeit, die für die "Hülle" um die FOR-Schleife für die wiederholte Berechnungsanforderung benötigt wird.
t1mittel ist die gemittelte Zeit einer Tabellenblattberechnung bei nTests Experimenten, wenn die "Steuerungszelle" A1 leer ist und somit keine SUMMENPRODUKT-Bildung erforderlich ist.
t2mittel ist die gemittelte Zeit einer Tabellenblattberechnung bei nTests Experimenten, wenn die "Steuerungszelle" A1 nicht leer ist und somit eine SUMMENPRODUKT-Bildung erforderlich ist.
Während t0mittel vernachlässigbar gering ist, lassen die immerwiederkehrenden unterschiedlichen Größe von t1mittel und t2mittel (t2mittel >> t1mittel) eigentlich nur den Schluß zu, dass der SONST-Ausdruck nicht mehr ausgewertet wird, wenn die If-Bedingung den Wahrheitwert WAHR einnimmt.
Unterschiedliche Werte für t1mittel und t2mittel in verschieden Experimenten, sind durch die Verwendung der NOW()-Funktion und durch unterschiedliche Zuteilung der Rechenzeiten an die Prozedur zu erklären. Durch die Teilung der Durchläufe in nTests und nLoops wurde jedoch für den ersten Ansatz gesichert, dass beide Prozedurteile annähernd gleichermaßen von den möglichen Verzögerungen betroffen werden.
Zum Testen an der Kopie des konkrete Tabellenblatts, wäre eigentlich nur die Prozedur in ein Standarsmodulordner des VBA-Projekts ([Alt][F11]) einzufügen und ggf. die "Steuerungszelle" (Cells(1,1) :=Zelle A1) und ihr Inhalt anzupassen. Je nach Anzahl der Matrixbereiche sollten die Werte nTests und nLoops nur vorsichtig erhöht werden, wenn es sinnvoll erscheint.
Gruß,
Uwe