25. januar 2002 - 16:58Der 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?
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!
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.
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
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
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))
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.
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
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.