@Luc:-? Prinzip vs. Praxis
17.09.2016 16:27:34
Michael
Hi,
Deine "prinzipiellen" Ausführungen sind natürlich nicht von der Hand zu weisen.
In diesem speziellen Fall (Level) sehe ich aber eher nicht das Problem, daß die Anzahl von UDFs ins Uferlose steigt...
Ganz allg. verfolge ich tendenziell "geschwindigkeitsoptimierte" Ansätze, was sich denn (wenn ich überhaupt UDFs einsetze - ich bevorzuge eher "reines VBA", damit die Kiste nur dann "rechnet", wenn ich es definitiv will) so auswirkt, daß ich lieber mehrere UDFs für "relativ ähnliche" Zwecke einsetzen würde, weil dann bei jeder einzelnen UDF der "bürokratische Overhead", die Fallunterscheidungen nämlich, entfallen.
200 Datensätze sind ja unkritisch, aber bei 200.000 würde ich auf alle Fälle so vorgehen...
Teste mal das simple Beispiel:
Option Explicit
Sub DatenErzeugen()
Dim a$(1 To 200000, 1 To 1)
Dim i&, k&, s$
Dim t0 As Single, t1 As Single
t0 = Timer
Randomize
For i = 1 To 200000
s = Chr(Int(Rnd() * 26 + 65))
For k = 1 To 5
s = s & Chr(Int(Rnd() * 26 + 65))
Next
a(i, 1) = s
Next
Range("A1").Resize(UBound(a)) = a
t1 = Timer
MsgBox "t1-t0: " & (t1 - t0) * 1000
End Sub
Sub Fct_Test()
Dim t0 As Single, t1 As Single
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchSt1(A1)"
t1 = Timer
Range("G1") = "BuchSt1": Range("H1") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchSt2(A1)"
t1 = Timer
Range("G2") = "BuchSt2": Range("H2") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchStX(A1;2)"
t1 = Timer
Range("G3") = "BuchStX": Range("H3") = (t1 - t0) * 1000
Range("B1:B200000").Clear
t0 = Timer
Range("B1:B200000").FormulaLocal = "=BuchStX2(A1;2)"
t1 = Timer
Range("G4") = "BuchStX2": Range("H4") = (t1 - t0) * 1000
End Sub
Function BuchStX(r As Range, p&) As String
BuchStX = Mid(r, p, 1)
End Function
Function BuchStX2(r As Range, p&) As String
BuchStX2 = Mid(r.Value, p, 1)
End Function
Function BuchSt1(r As Range) As String
BuchSt1 = Mid(r, 1, 1)
End Function
Function BuchSt2(r As Range) As String
BuchSt2 = Mid(r.Value, 1, 1)
End Function
Es gibt zwei Varianten, einmal "fix" und einmal mit 2. Parameter, und die jeweils mit r oder r.value.
Bei 200.000 Werten sieht man schon einen Unterschied: r.value ist einen Ticken schneller, so um die 5%, und die Functions mit 2. Parameter benötigen rund 7% mehr Zeit.
In dem Fall wird mit dem Parameter ja nicht mal gerechnet (oder verglichen usw.), er wird nur 1:1 übernommen.
Ach so, in meiner "Variante" und überhaupt ist das ByRef ziemlich fehl am Platze...
Schöne Grüße,
Michael