Erste Strategie: Die Funktion selbst optimieren
Sollte die Geschwindigkeit verdoppeln
Public Function Yield(Name As String, Price As Double) Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End Function
Dies liegt daran, dass Sie den Bereich mit dem Namen "LookupRange" nur einmal und nicht zweimal suchen und nur einmal und nicht zweimal die richtige Linie suchen.
Zweite Strategie: Abruf der Reichweite nur einmal im Voraus
Wahrscheinlich 4 mal so schnell
Wenn wir den Bereich im Code abrufen, der die yield
Funktion verwendet, müssen wir das nur einmal tun
Public Function Yield(Lookup As Range, Name As String, Price As Double) rw = Application.WorksheetFunction.Match(Name, Lookup.Resize(ColumnSize:=1), 0) Yield = 100 * Application.Run("otherCustomFunction", Lookup.Cells(rw, 3), Lookup.Cells(rw, 7), Price) End Function Public Sub CallingRoutine() Dim Lookup As Range, rw As Integer Set Lookup = Range("LookupRange") ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Lookup, Name, Price) ' Some code that used the yield Next someThing End Sub
Es gibt eine Variante dieser Strategie, bei der Sie Lookup außerhalb aller Routinen deklarieren, wie ich es mit dem nachstehenden Wörterbuch mache.
Dritte Strategie: Tragen Sie alle relevanten Werte in ein Wörterbuch ein
Eine Größenordnung schneller, wenn Sie Yield
sehr oft anrufen .
- Sie suchen im benannten Bereich nach
- Sie verlangen alle Werte gleichzeitig von Excel
- Sie suchen die
Name
s in einem Wörterbuch, was viel effizienter ist als das Nachschlagen in einem Bereich
Dies ist der Code:
Public Function Yield(Name As String, Price As Double) If LookDict Is Nothing Then Set LookDict = New Dictionary Dim LookVal As Variant, rw As Integer, ToUse As ToUseType LookVal = Range("LookupRange").Value For rw = LBound(LookVal, 1) To UBound(LookVal, 1) Set ToUse = New ToUseType ToUse.Row3Val = LookVal(rw, 3) ToUse.Row7Val = LookVal(rw, 7) LookDict.Add LookVal(rw, 1), ToUse Next rw End If Set ToUse = LookDict.Item(Name) Yield = 100 * Application.Run("otherCustomFunction", _ ToUse.Row3Val, ToUse.Row7Val, Price) End Function Public Sub CallingRoutine() ' Some code For Each someItem In someSet Dim amount As Double, Name As String, Price As Double ' Some code to deter;ine name and price amount = Yield(Name, Price) ' Some code that used the yield Next someThing End Sub