Pierwsza strategia: zoptymalizuj samą funkcję
Powinien podwoić prędkość
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
Wynika to z tego, że wyszukujesz zakres o nazwie „LookupRange” tylko raz zamiast dwa razy i tylko raz szukasz właściwej linii zamiast dwa razy.
Druga strategia: odzyskaj zasięg tylko raz z góry
Prawdopodobnie 4 razy szybciej
Jeśli pobieramy zakres w kodzie używającym yield
funkcji, musimy to zrobić tylko raz
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
Istnieje wariant tej strategii, w którym zadeklarujesz wyszukiwanie poza wszystkimi procedurami, tak jak w przypadku poniższego słownika.
Trzecia strategia: umieść wszystkie istotne wartości w słowniku
O rząd wielkości szybciej, jeśli Yield
często dzwonisz do BARDZO.
- Sprawdzasz nazwany zakres
- Pytasz wszystkie wartości od Excela naraz
- Wyszukiwanie
Name
słownika odbywa się w słowniku, który jest o wiele bardziej wydajny niż wyszukiwanie zakresu
To jest kod:
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