Avatar billede friis5 Novice
16. november 2007 - 13:43 Der er 8 kommentarer og
1 løsning

Problemer med Excel Functions

Ved af VBA har jeg lavet et to dimentionelt array med værdier. Jeg vil gerne bruge div. "rækker" og "søjler" fra arrayet til input i en Excel function.

F.Eks med worksheetfunction.correl

Dim arr As Variant
Dim answer as Double

arr = Range("A1:B10").Value
answer = application.worksheetfunction.correl(arr(column1),arr(column2))

Det skulle gerne give det samme resultat som:
answer = application.worksheetfunction.correl(range("A1:A10"),range("B1:B10"))

Da jeg laver en del beregninger på det indlæste range, ville jeg foretrække ikke at paste det tilbage i arket, for at lave beregningerne! Det tager simpelthen for meget tid.

Hvordan kommer jeg nemmest rundt om mit problem?
Avatar billede excelent Ekspert
16. november 2007 - 16:48 #1
Du kunne evt. gøre sådan :

Sub Korrelation()

Dim Vektor1
Dim Vektor2

Vektor1 = Range("A1:A10")
Vektor2 = Range("B1:B10")

answer = Application.WorksheetFunction.Correl(Vektor1, Vektor2)

MsgBox answer

End Sub
Avatar billede friis5 Novice
19. november 2007 - 09:42 #2
Lå min data i arket, ville det bestemt være en god løsning, men nu ligger det som behandlet data i et array.

Endvidere skal jeg ikke have korrelationen for hele vektoren (i arrayet), men kun fx. 22 af cellerne i kolonne 1 mod kolonne 2...

I en løkke med både j, i, k og rk

TempResultArray(rk, k) = WorksheetFunction.Correl(Range(Sheets("Data").Range("A10").Cells(1, i), Sheets("Data").Range("A10").Cells(rk, i)), Range(Sheets("Data").Range("A10").Cells(1, j), Sheets("Data").Range("A10").Cells(rk, j)))

Her benyttes et Range fra arket, men jeg vil gerne kunne gøre det med et indlæst array.
Avatar billede excelent Ekspert
19. november 2007 - 17:24 #3
Mig bekendt kan man ikke inlæse den ene dimension af en array i en variabel i et hug, den skal indlæses via en løkke som i eks. herunder.
Hvad der så er hurtigst i et konkret eks. må bero på hvor mange elementer der skal indlæses via løkken.
At læse fra et range til en array er ikke den store tidsrøver
hvorimod at skrive tager en del tid.

M.h.t din kodelinie ! virker den rent faktisk eller ? :-)
må indrømme jeg har lidt svært ved at gennemskue den.

Sub Korrelation2()

Dim Vektor1 As Variant
Dim var1(100)
Dim var2(100)

Vektor1 = Sheets("Ark1").Range("A1:B10")

For t = 2 To 6
var1(t) = Vektor1(t, 1)
var2(t) = Vektor1(t, 2)
Next

answer = Application.WorksheetFunction.Correl(var1, var2)

MsgBox answer

End Sub
Avatar billede friis5 Novice
20. november 2007 - 09:46 #4
Jeg ville virkeligt gerne lige paste hele den (ja meget overraskende) velfungerende kode ind - men den er virkelig skør (det skal måske tilføjes, at jeg ikke selv har skrevet den).

Men det er ikke helt tilfældet - dog er tilfældet, at jeg skal rette den, da den laver korrelation på kursen og ikke afkastet. (underordnet her).

Derfor indlæser jeg kurserne i et stort array (kurser for op til 18 aktiver) beregner afkastene, og derefter skal så korrelationerne beregnes. Her er pænt mange, og det skal være op til brugeren, om det skal være 1 dag, 1 uge, 1 måned tilbage osv. Sidst skal det grafiske output også generes hvor vi kigger på udviklingen i korrelationerne over tid.

Det meste er det er faktisk lige til, når først man har fået lavet den fleksabilitet man ønsker i arket, og da koden rent faktisk pt kører, så er det kun et spørgsmål om at gøre den lidt hurtigere (da den står og "summer" længe, når mange aktiver er valgt).

Der er mange grafer, matricer og en MASSE output der skal genereres og skrives. Derfor søger jeg en metode der kan optimere min kode i hastighed - men jeg tror pt, at jeg vil vælge at skrive ud i arket, beregne videre og slette det efterfølgende :)
Avatar billede friis5 Novice
20. november 2007 - 10:28 #5
Fed tale jeg skrev før :S

Nu virker koden, tog udgangspunkt i dit :)

Option Base 1

Sub Korrelation2()

Dim TempAfkastArray As Variant
Dim TempResultarray() As Variant
Dim var1() As Variant
Dim var2() As Variant

TempAfkastArray = Sheets("Ark1").Range("A1:C10")

ReDim var1(Sheets("Ark1").Range("A1:C10").Rows.Count)
ReDim var2(Sheets("Ark1").Range("A1:C10").Rows.Count)
ReDim TempResultarray(Sheets("Ark1").Range("A1:C10").Columns.Count)

temp = 0
For i = 1 To Sheets("Ark1").Range("A1:C10").Columns.Count - 1
    For j = i + 1 To Sheets("Ark1").Range("A1:C10").Columns.Count
        For t = 1 To UBound(TempAfkastArray)
            var1(t) = TempAfkastArray(t, i)
            var2(t) = TempAfkastArray(t, j)
        Next t
        temp = temp + 1
        TempResultarray(temp) = Application.WorksheetFunction.Correl(var1, var2)
        MsgBox TempResultarray(temp)
    Next j
Next i

End Sub
Avatar billede friis5 Novice
20. november 2007 - 11:23 #6
Hov, den manglede at skrive antallet af elementer i resultat søjlen ordentligt...

Option Base 1

Sub Korrelation()

Dim TempAfkastArray As Variant
Dim TempResultarray() As Variant
Dim var1() As Variant
Dim var2() As Variant
Dim nr As Integer
Dim nc As Integer

TempAfkastArray = Sheets("Ark1").Range("A1:F10")
nr = Sheets("Ark1").Range("A1:F10").Rows.Count
nc = Sheets("Ark1").Range("A1:F10").Columns.Count

ReDim var1(nr)
ReDim var2(nr)
ReDim TempResultarray(Antal_Kovariater(nc))

temp = 0
For i = 1 To nc - 1
    For j = i + 1 To nc
        For t = 1 To nr
            var1(t) = TempAfkastArray(t, i)
            var2(t) = TempAfkastArray(t, j)
        Next t
        temp = temp + 1
        TempResultarray(temp) = Application.WorksheetFunction.Correl(var1, var2)
        'MsgBox TempResultarray(temp)
    Next j
Next i

End Sub

Function Antal_Kovariater(nc As Integer)

    Antal_Kovariater = 0
    For i = 1 To nc
        temp = temp + (nc - i)
    Next i

    Antal_Kovariater = temp
   
End Function
Avatar billede excelent Ekspert
20. november 2007 - 16:26 #7
så du fik det til at køre eller ? :-)
Avatar billede friis5 Novice
21. november 2007 - 15:10 #8
Yes det gjorde jeg, bare svar så får du points som altid er dig fortjent :)
Avatar billede excelent Ekspert
21. november 2007 - 15:18 #9
ok tak :-)
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
Excel kurser for alle niveauer og behov – find det kursus, der passer til dig

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