Avatar billede sjogren Novice
25. januar 2002 - 16:58 Der er 12 kommentarer og
1 løsning

Variabelt serie output fra VBA

Opgavebeskrivelse:

Jeg har en mændge data (A,B,C,...) fordelt på dato, som der dels:

- skal foretages beregninger på i en variabel datoperiode
- efterfølgende skal indekseres udfra sumværdien på startdagen

Eks.:
Beregningsperiode: Startdato; 2.jan.01 og n dage frem i tiden

Beregning af sumværdi (SV) pr. dato:
(A1 x 30%) + (B1 x 30%) + (C1 x 40%) = sumværdi for dato_1 (er lig SV_indeks)
(A2 x 30%) + (B2 x 30%) + (C2 x 40%) = sumværdi for dato_2
.
.
(An x 30%) + (Bn x 30%) + (Cn x 40%) = sumværdi for dato_n
     

Indeksering af SV pr. dato:       
dato 1= 100
dato 2= (SV2 - SV_indeks)/SV_indeks
.
.
dato_n= (SVn - SV_indeks)/SV_indeks

Sprøgsmål:

Er der nogen der ved hvordan man i VBA kan skrive en koder, der kan foretage ovennævnte
beregninger og efterfølgende sætte indeksværdierne pr. dato ind i et regneark?
Avatar billede bak Forsker
26. januar 2002 - 14:00 #1
Jeg er lidt i tvivl sjogren. Er der kun et index i datamængden eller kan der være flere (1 for hver n'te dag)?
Hvor står datoen?
Avatar billede sjogren Novice
26. januar 2002 - 14:33 #2
Hej bak

Her er principielt udsnit af datamængden:

Dato  A
Avatar billede sjogren Novice
26. januar 2002 - 14:48 #3
Hej bak (ups jeg kom til at trykke på TAB !)

Her er principielt udsnit af datamængden:
Dato        A      B      C      Sumværdi  Indekseret SV
----------------------------------------------------------
.          .      .      .      .
.          .      .      .      .
01-01-01    5      10    20      35          100
02-01-01    6      9    22      37          105,71
.          .      .      .      .          .
.          .      .      .      .          .
.          .      .      .      .          .
31-12-01  10      5      35      50          142,86
01-01-02  11      6      41      58

Sumværdien beregnes altså for hver dag i det variable datointerval.
Hvis f.eks. 1.jan.01 er startdato og 31.dec.01 er sludato, sættes
sumværdien for 1.jan.01 (35) lig 100 og de øvrige sumværdier i
datointervallet indekseres på basis heraf, dvs.
((sumværdi_n - sumværdi_startdato)/sumværdi_startdato) x 100

Hele tidsserien skal efterfølgende udtrykkes i en graf!

Jeg håber du kan hjælpe mig
På for tak :-)
Avatar billede lsimony Nybegynder
26. januar 2002 - 15:35 #4
Nu kan det godt være at jeg spørger dumt, hvorfor skal det være VBA? Hvorfor skriver du ikke bare formlerne ind i cellerne og kopier dem ned af kolonnen?

Hilsen

Lars

PS. Jeg kan godt hjælpe dig med en løkke som foretager denne beregning.
Avatar billede sjogren Novice
26. januar 2002 - 17:30 #5
Hej Lars

Jeg kan godt forstå du spørger (jeg har jo lavet hele molevitten i Excel). Baggrunden er, at jeg er i gang med at lave en VBA-baseret "regnemaskine", som modtager forskellige input fra "brugere", foretager beregninger, mv. og returnere med forskellige output til "brugerne".

Måske lidt kryptisk, men det nu en gang målet!
Hilsen
Sjøgren
Avatar billede bak Forsker
27. januar 2002 - 20:43 #6
Ok Sjøgren. her er et svar, selvom jeg har et pare små uklarheder.
svaret forudsætter at dato er i kol A, A i kol B, B i kol C.
jeg er uklar på din beregning. I første eksempel gange du nogen parametre på (30%,30%, og 40%), Det gør du ikke i dit andet eksempel. I svaret er disse ganget på.

Sub Indexering()
Startdato = CDate(InputBox("Startdato"))
Slutdato = CDate(InputBox("Slutdato"))
Set DatoOmråde = Range("A1", Range("A65536").End(xlUp).Offset(1, 0))
For Each d In DatoOmråde
    If d.Value = Startdato Then
        StartVærdi = ((d.Offset(0, 1) * 30) + (d.Offset(0, 2) * 30) + (d.Offset(0, 3)) * 40) / 100
        d.Offset(0, 4).Value = StartVærdi
        d.Offset(0, 5).Value = 100
    End If
    If d.Value <= Slutdato And d.Value > Startdato Then
        d.Offset(0, 4).Value = ((d.Offset(0, 1) * 30) + (d.Offset(0, 2) * 30) + (d.Offset(0, 3)) * 40) / 100
        d.Offset(0, 5) = d.Offset(0, 4) * 100 / StartVærdi
    End If
Next
End Sub
27. januar 2002 - 21:18 #7
Bak's private undervisning!!
d antager et Range object, og skal derfor have præfixet r, som f.eks. rCell - det samme gælder DataOmråde (æøå bruges aldrig!!!) DataOmråde kan jo også undlades.

Dim rCell As Range
For Each rCell In Range("A1", Range("A65536").End(xlUp).Offset(1, 0))
27. januar 2002 - 21:22 #8
En anden mulighed (mangler måske en celle nedad ?)
Dim rCell As Range
For Each rCell In Range("A1").CurrentRegion.Columns(1).Cells
Avatar billede bak Forsker
27. januar 2002 - 21:33 #9
Tak for det Flemming, jeg må vel se at få det lært, det med navngivning af variable :-)
Du har iøvrig ret i at datoområde er unødvendig, men koden startede ud med at være en del længere.
Jeg kan godt lide din 2. mulighed.
Avatar billede bak Forsker
27. januar 2002 - 21:35 #10
Flemming, er du ikke Concorde-mand??
Avatar billede sjogren Novice
28. januar 2002 - 09:55 #11
Hej bak og Flemming

Ok - jeg vil ikke "stå i vejen" når ekspertisen tumler, men jeg er nu lidt i tvivl om hvordan I så mener den endelige kode skal være?

Vil I have ulejlighed med at skære det ud i pap for mig - please
Avatar billede bak Forsker
28. januar 2002 - 10:59 #12
du behøver ikke ændre noget. Koden kører udemærket. Det er et spørgsmål om udformning af en kode flemming og jeg taler om.
Men hvis du vil så:
Sub Indexering()
Startdato = CDate(InputBox("Startdato"))
Slutdato = CDate(InputBox("Slutdato"))
For Each d In Range("A1", Range("A65536").End(xlUp).Offset(1, 0))
    If d.Value = Startdato Then
        StartVærdi = ((d.Offset(0, 1) * 30) + (d.Offset(0, 2) * 30) + (d.Offset(0, 3)) * 40) / 100
        d.Offset(0, 4).Value = StartVærdi
        d.Offset(0, 5).Value = 100
    End If
    If d.Value <= Slutdato And d.Value > Startdato Then
        d.Offset(0, 4).Value = ((d.Offset(0, 1) * 30) + (d.Offset(0, 2) * 30) + (d.Offset(0, 3)) * 40) / 100
        d.Offset(0, 5) = d.Offset(0, 4) * 100 / StartVærdi
    End If
Next
End Sub
Avatar billede sjogren Novice
28. januar 2002 - 13:07 #13
tak bak :-)
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
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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