Avatar billede justincase1089 Nybegynder
26. februar 2002 - 18:04 Der er 2 kommentarer og
1 løsning

Interpolation i VB Excel

Hej

Jeg er ikke den helt store ørn til at programmere i VB, derfor denne forespørgsel.

Jeg har brug for en funktion i excel der ikke er der i forvejen. Jeg har nu forgæves forsøgt at programmere mig ud af det i VB i et par timer, en må kaste håndklædet i ringen.

Jeg har brug for en funktion, der tager en range "XY" og en double "X" som input og returnerer en double "Y".

Rangen har 2 kolonner og et vilkårlig antal rækker (indenfor rimelighedens grænser :)". Ud fra kolonne 1 i XY skal det rigtige interval findes og der skal interpoleres en Y værdi som resultat.

Det her er egentlig en meget simpel ting, men mine evner har ikke kunnet række :/.

Problemet kan også beskrives på en anden måde: man har en lang række X+Y punkter der danner en kurve og derudfra beregnes en interpoleret Y værdi ud fra en given X værdi.

Jeg håber der er en eller anden der kan bruge 3 minutter på mit problem. Det skal helst være en funktion jeg kan bruge på lige fod med alle de andre funktioner der er i excel.

Tak

Justin Case

P.S. 60 point fordi opgaven nok kræver en smule fodarbejde. Ikke fordi den er svær (for den rutinerede)
Avatar billede justincase1089 Nybegynder
26. februar 2002 - 18:05 #1
Jeg bruger iøvrigt Excel97, men jeg kan ikke forestille mig, at andre versioner er meget anderledes
Avatar billede jennemaan Nybegynder
26. februar 2002 - 18:14 #2
Function garCurveInterpol(ByVal arInput As Variant, ByVal ldblXval As Double) As Double

Dim larInput As Variant
Dim lbolFound As Boolean

Dim lintElement As Integer
Dim lintUbound As Integer

Dim ldblFrac As Double
Dim lintX As Integer


'convert possible rangeobject to array
larInput = arInput

'todo: sort larinput

If ldblXval <= larInput(LBound(larInput, 1), LBound(larInput, 2)) Then
    garCurveInterpol = larInput(LBound(larInput, 1), UBound(larInput, 2)) ' x < lower bound
ElseIf ldblXval >= larInput(UBound(larInput, 1), LBound(larInput, 2)) Then
    garCurveInterpol = larInput(UBound(larInput, 1), UBound(larInput, 2)) ' x > upper bound
Else

'first find max(elm) <= x
    lbolFound = False
    lintX = LBound(larInput, 1)
    While Not lbolFound
    If larInput(lintX, 1) <= ldblXval And larInput(lintX + 1, 1) >= ldblXval Then
        lbolFound = True
    Else
        lintX = lintX + 1
    End If
    Wend
   
ldblFrac = (ldblXval - larInput(lintX, 1)) / (larInput(lintX + 1, 1) - larInput(lintX, 1))
garCurveInterpol = (1 - ldblFrac) * larInput(lintX, 2) + ldblFrac * larInput(lintX + 1, 2)
End If
End Function


Bemærk at den forudsætter at tidsrækkerne er sorteret efter første kolonne.

/Jennemaan
Avatar billede justincase1089 Nybegynder
26. februar 2002 - 18:21 #3
hehe
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
Kurser inden for grundlæggende programmering

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