Avatar billede allenb Nybegynder
04. september 2003 - 10:40 Der er 6 kommentarer og
1 løsning

Optimering af brugerdefineret funktion

Har lavet en funktion i stil med lopslag, har dog problmer med performance, idet den er lang tid om at beregne når der er mange formler der benytter den.

Har prøvet at sætte enableevents, calculation og screenupdate til false, men det hjælper ikke rigtig noget.

Nogen der har et godt bud?? - eller evt. retningslinier når man opbygger egne formler....

På forhånd tak for hjælpen!
Avatar billede Slettet bruger
04. september 2003 - 10:48 #1
Det ville hjælpe hvis vi kunne se noget kode...  :-)
Avatar billede allenb Nybegynder
04. september 2003 - 10:53 #2
henter tal fra fast defineret område...


Public Function YTD(intPeriod As Integer, strAccount As String, rngArea As Range)

Dim rngLookuparea As Range
Set rngLookuparea = rngArea

For Each cell In rngLookuparea
    If cell = strAccount Then
        YTD = 0
        For t = 1 To intPeriod
            YTD = YTD + cell.Offset(0, t + 11)
        Next
        YTD = CDbl(YTD)
        Exit Function
    Else
        YTD = "#N/A"
    End If
Next

End Function
Avatar billede bak Forsker
04. september 2003 - 12:44 #3
prøv at om denne er hurtigere

Public Function YTD(intPeriod As Integer, strAccount As String, rngArea As Range)
Dim t As Long
Dim rng As Range
Application.Volatile
On Error GoTo fejl
t = Application.WorksheetFunction.Match(strAccount, rngArea, 0) + 1
If Not IsError(t) Then
    Set rng = Range(rngArea(t, 12).Address & ":" & rngArea(t, intPeriod + 11).Address)
    YTD = Application.WorksheetFunction.Sum(rng)
    Exit Function
End If
fejl:
YTD = "#N/A"
End Function
Avatar billede allenb Nybegynder
04. september 2003 - 13:58 #4
havde selv lige fundet en tilsvarende løsning:

Man må nok indse at man skal bruge predefinerede funktioner for at bevare performance.

hvad gør Application.Volatile?




Public Function YTD(strAccount As String, rngArea As Range, intPeriod As Integer, Optional blnTest As Boolean = False)

Dim tmpRange As Range
Set tmpRange = rngArea

YTD = 0


    For t = 1 To intPeriod
        YTD = YTD + Application.WorksheetFunction.VLookup(strAccount, tmpRange, t + 12, False)
    Next
   
    YTD = CDbl(YTD)



End Function
Avatar billede allenb Nybegynder
04. september 2003 - 14:02 #5
stikker du et svar bak, så du kan få point fordi du gad bruge tiden....

konklusionen må være: brug så vidt muligt eksisterende funktioner, så må man være lidt kreativ
Avatar billede bak Forsker
04. september 2003 - 16:37 #6
Application.Volatile gør at funktionen beregnes hver gang excel laver en beregning. det er nok unødvendigt i dette tilfælde.

lige en kommentar til din egen funktion:
Det er rigtigt at excels indbyggede funktioner for det meste er meget hurtigere end hjemmelavede, da de er skrevet i C og optimeret til det yderste, men de kræver dog også lidt performance :-)
I din funktion laver du lige så mange vlookups, som du har perioder.
Jeg har forsøgt at begrænse mig således at min funktion kun bruger 2 indbyggede funktioner ( 1 match og 1 sum )
Avatar billede allenb Nybegynder
05. september 2003 - 08:44 #7
Tak for hjælpen og konstruktiv feedback!!!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi har et stort udvalg af Excel kurser. Find lige det kursus der passer dig lige her.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester