Hallo wenn und Hallo Wien
11.11.2016 15:31:28
Michael
Hi,
irgendwie ist mir Lucs Faden auch entgangen, aber dank des Hinweises an Werner habe ich ihn dann doch einigermaßen gründlich überflogen.
Insbesondere die Zusammenfassung hat mir getaugt, wenn ich auch zugeben muß, daß ich die Besonderheiten mit strings als Parameter überlesen habe.
In dem Zusammenhang fällt mir ein, daß man mal überprüfen könnte, inwieweit Excel nicht die Zweige, sondern die Bedingungen auswertet: bei meinem guten, alten Pascal-Compiler (TP 3.01) hieß es, daß nachfolgende Bedingungen ("rechts") gar nicht mehr berechnet werden, sobald ein eindeutiges Ergebnis vorliegt.
Was ich so verstehe, daß bei einer Konstruktion wie a=0:b=1: If (a=b) And (weitere Bedingungen) alles nach dem And schon wurscht ist, weil durch das false links vom And der ganze Ausdruck false ist.
Die Bedeutung liegt dann in der optimierten Umsetzung der (erwarteten) Priorität von Bedingungen, anhand derer man die Ifs formuliert und ggf. verschachtelt, um z.B. ein Event-Makro möglichst schnell verlassen zu können, falls nichts zu tun ist.
Man sehe sich an:
Option Explicit
Dim jj&, kk&
Function fj(i) As Boolean
jj = jj + 1
fj = (i And 2) = 2
End Function
Function fk(i) As Boolean
kk = kk + 1
fk = (i And 4) = 4
End Function
Sub testen() ' *** die hier aufrufen ***
Const wdh = 10000
Cells.Clear
Call test0("A", wdh)
Call test1("D", wdh)
End Sub
Sub test1(sp$, wdh&)
Dim i&, j&, k&, w&
Dim a(499, 1)
Dim t0 As Single
For i = 0 To 499: a(i, 0) = i: Next
t0 = Timer
For w = 1 To wdh
kk = 0: jj = 0
For i = 0 To 499
If (i And 1) = 1 Then If fj(i) Then If fk(i) Then a(i, 1) = 1
Next
Next
Range(sp & "3") = "t : " & (Timer - t0)
Range(sp & "1") = "jj: " & jj
Range(sp & "2") = "kk: " & kk
Range(sp & "4").Resize(500, 2) = a
End Sub
Sub test0(sp$, wdh&)
Dim i&, j&, k&, w&
Dim a(499, 1)
Dim t0 As Single
For i = 0 To 499: a(i, 0) = i: Next
t0 = Timer
For w = 1 To wdh
kk = 0: jj = 0
For i = 0 To 499
If ((i And 1) = 1) And fj(i) And fk(i) Then a(i, 1) = 1
Next
Next
Range(sp & "3") = "t : " & (Timer - t0)
Range(sp & "1") = "jj: " & jj
Range(sp & "2") = "kk: " & kk
Range(sp & "4").Resize(500, 2) = a
End Sub
Wenn man das Ding mit kleinen wdh einsetzt, ist der Unterschied wurscht, aber bei wdh=10000 sieht man schon, worauf es hinausläuft.
Schöne Grüße & baba nach Wien,
Michael