VBA programmering og videregående EDB

Thursday, June 22, 2006

Objekt-variable i VBA

F.eks. kan man dimensionere en objekt-variabel som et Range:

Dim MyRng As Range
Set MyRng = ActiveWorkbook.Worksheets("Data").Range("A1:A15")

' det er nu nemt at arbejde med Ranget, og f.eks. ændre font
MyRng.Font.Size = 12

De forskellige "vinduer" i VBA

Editerings vinduet er det vindue hvor man laver/retter selve VBA koden.

Project Explorer vinduet viser de åbnede VBA-projekter og komponenter som indgår i disse. Vises til venstre i den øvre del af skærmen.

Properties vinduet viser egenskaber for det åbnede objekt, og det er her også muligt at rette i disse egenskaber.

Immediate vinduet viser outputtet vha. debug.print koden.

Collections i VBA

Et collections objekt er et objekt der holder styr på andre objekter i VBA. F.eks. er Worksheets et collection objekt for Worksheet-objektet.

Hændelser i VBA

Mange objekter i VBA responderer på hændelser (ofte hændelser skabt af brugeren), f.eks. tryk på en knap, klik med musen eller åbning af en fil.

Objekter, egenskaber og metoder i VBA

Objekter er de elementer som VBA-programmeringssproget består af. Et eksempel kunne være Range-objektet.Objekter kontrolleres af 2 ting: egenskaber og metoder.

Egenskaber henviser til objektets karakteristika. Når et objekts egenskaber ændres, ændres objektets opførsel, udseende eller lignende. Med egenskaber kan man f.eks. ændre farve eller skrifttype for et range.

Metoder er handlinger som objekterne kan udføre. Et eksempel kunne være Clear-metoden for Range-objektet.

Fejl og mangler - og genialiteter
Lad mig starte med et par mangler som mine programmer har.I min rapport skriver jeg ganske vist at mit program til opgave 2 til samling af salgsdata i en samlet fil, forudsætter at subrutinen fra opgave 1 er gennemført succesfuldt for alle månederne i det år man ønsker at samle salgsdata for. Mit program til samling af salgsdata, har dog ingen validering eller fejlhåndtering, hvilket betyder at der vil opstå fejl, hvis forudsætningen om omregnede salgsdatafiler for alle månederne i året ikke holder.
Derudover fandt jeg undervejs i løsningen af opgaverne ud af, at man ikke behøver at gemme ark-navne i variabler for at kunne vende tilbage til disse ark (som jeg har gjort i opgave 1). Man kan blot referere til det enkelte ark ved at skrive eksempelvis ThisWoorkbook.Worksheets(1) som jeg også har gjort i de efterfølgende opgaver. På dette punkt vil det altså være muligt at optimere min kode til opgave 1, hvis man måtte ønske dette.
Desuden vil jeg lige bemærke, at jeg er opmærksom på den manglende konsistens mht. min løsning af henholdsvis opgave 1 og opgave 5. I opgave 1 antager jeg at der gælder et relativt forhold mht. filernes placering i forhold til hinanden. Således skal brugeren i mit program til opgave 1, kun vælge hvilken fil med salgsdata som ønskes omregnet. Så finder programmet selv ud af at åbne filen med valutakoder og filen med valutakurser.I opgave 5 har jeg derimod valgt at brugeren først skal åbne filen med koordinater og dernæst filen med kundevalutaer. Her skal brugeren altså opnå 2 filer, men til gengæld forudsætter programmet ikke at filerne har en bestemt placering relativt til hinanden.Jeg har valgt de to forskellige måder, for netop at vise at der er forskellige måder at gøre det på.
Hvis jeg til sidst lige skal fremhæve en stump kode, som jeg er særligt glad for, er det den løsning med array, som jeg har lavet i opgave 3 til generering af et budget. Her gennemløbes en For-løkke hvor det faktiske salg for de 12 måneder i det aktuelle år gemmes på de 12 første pladser i array'et. Dernæst gennemløbes en ny For-løkke som beregner det forventede salg for de 12 måneder i budgetåret, som et gennemsnit af de foregående 5 pladser i array'et + 10%. Det syntes jeg selv er en ret smart løsning, som er lyn-hurtig at eksekvere.


Eksamensopgave i Videregående EDB
- Programmering i VBA

1. Indledning
Som ansat i en større dansk handelsvirksomhed, har jeg fået til opgave at tilrette virksomhedens nuværende EDB-system, således at man stadig kan drage fuld nytte af virksomhedens data. Da virksomhedens nuværende system er baseret på Excel, er det oplagt, at den ønskede tilpasning foretages vha. VBA.
Denne korte indledning efterfølges af problemformuleringen, som udgør udgangspunktet for resten af rapporten. Rapporten er inddelt i hovedafsnit for hver opgave, og hvert hovedafsnit er inddelt i underafsnit med problemanalyse og afgrænsning, løsningsmetode samt implementering og afprøvning. Rapporten afsluttes med en konklusion.
Excel-fil (vba_program.xls) med de udarbejdede programmer findes på vedlagte CD.
2. Problemformulering
Virksomheden handler med kunder over hele Verden, og de månedlige salgsdata fremgår af de til opgaven medfølgende salgsfiler. Der er dog det problem, at disse salgsdata er opgjort i lokal valuta, og første opgave består således i at omregne disse salgsdata til dansk valuta. Som det fremgår af opgaveteksten, skal filerne med de omregnede salgsdata have samme struktur som de oprindelige filer.
Dernæst skal der laves et program, som samler de omregnede salgsdata i én samlet fil. Der skal laves en fleksibel løsning, således at der er mulighed for at lave korrektioner til foregående måneder samt indlæse fremtidige salgsdata.
Med udgangspunkt i den samlede fil med omregnede salgsdata laves en subrutine, der kan generere et budget for det kommende år. Jævnfør opgaveteksten skal subrutinen beregne budgettet på baggrund af et gennemsnit for de foregående 5 måneder tillagt 10%.
Næste opgave er at lave en rutine, der kan tage imod en given måned fra brugeren og dernæst beregne, hvor stor en del af det samlede salg de 10 største kunder tegnede sig for i den pågældende måned. Endvidere laves et lagkagediagram til illustration af den indbyrdes fordeling af salget mellem de 10 største kunder.
Endelig besvares opgavetekstens opgave 5 og 6, hvor der skal laves en subrutine som ud fra de europæiske kunders x,y koordinater sammenholdt med salget til disse kunder (altså vigtigheden af kunderne) beregner en optimal placering af virksomhedens nye varelager. Resultat præsenteres i en MsgBox samt i et dynamisk genereret XY-diagram jævnfør opgave 6 i opgaveteksten.
3. Omregning af salgsdata
Første opgave er altså at lave et program, der kan omregne filerne med de månedlige salgsdata til dansk valuta, og første skridt er at analysere problemstillingen nærmere og foretage den nødvendige afgrænsning.
3.1 Problemanalyse og afgrænsning
Som beskrevet i problemformuleringen, skal output filerne have samme struktur som de oprindelige filer. Dette udstikker altså nogle ganske klare retningslinier for det resultat, som programmet skal give, hvilket dog er fint i tråd med opgave 2. Output filerne fra opgave 1 skal altså helst gøre det så nemt som muligt at samle de omregnede salgsdata i én samlet fil, og det er det, hvis filernes oprindelige struktur bevares.
I dette program har jeg valgt at forudsætte, at antallet af kunder er fast, idet alle de nuværende salgsfiler samt filen med kundevalutaer alle omfatter 100 kunder. Min kode vil dog med ganske få rettelser kunne gøres dynamisk, således at programmet kan håndtere et varierende antal kunder.
Endvidere antages det, at filen med kundevaluta er sorteret efter kundenummer i stigende orden. Ligeledes forudsættes det, at det relative forhold mellem mapperne ”diverse”, ”salgsdata” og ”valutakurser” er gældende (uanset hvor disse mapper så ellers måtte være placeret).
Endelig har jeg valgt, at programmet kun skal omregne én fil ad gangen i stedet for alle på en gang. I starten er det lidt besværligt for brugeren, at han skal gennemføre omregning for alle 12 salgsfiler (altså køre programmet 12 gange), men på længere sigt er det en fordel, at programmet ikke kører alle filerne igennem, når det kun er den seneste måned, der mangler at blive beregnet.
3.2 Løsningsmetode
Med udgangspunkt i problemanalysen og afgrænsningen har jeg opstillet en plan for, hvorledes opgaven løses:
- Først laves en dialogboks, hvor brugeren bliver bedt om at vælge den salgsfil, som ønskes omregnet.
- Udfra stien til den valgte salgsfil, finder programmet selv ud af, hvor filen med kundevaluta er placeret, og denne åbnes.
- En For-løkke gennemløbes 100 gange og genererer et array (med 100 pladser), der holder styr på, hvilke valutaer der er tilknyttet de enkelte kunder, hvorefter filen med kundevalutaer lukkes igen.
- Udfra salgsdata-filens filnavn og sti finder programmet selv ud af at åbne den tilhørende fil med valutakurser.
- Der defineres et range med kundenumrene i salgsdatafilen. En For-Each løkke gennemløber dette range og sammenholder kundenumrene med disses valutaer, som er gemt i array’et (som beskrevet ovenfor). En If-sætning sammenligner kundernes valuta, med hver enkelt række i filen med valutakurser, og når de er lig med hinanden (og der ikke er tale om DKK), så ganges den pågældende valutakurs på salgstallet.
- Endelig gemmes salgsfilen med tilføjelse af ”dk” til sidst i filnavnet, og filen med valutakurser lukkes.
3.3 Implementering og afprøvning
Den endelige kode for opgave 1 fremgår af bilag 1. Inden jeg nåede så langt, fandt jeg dog ved afprøvning af programmet ud af, at der er visse uregelmæssigheder i datafilerne (som det også er beskrevet i opgaveteksten). I første omgang kunne jeg ikke forstå, hvorfor eksempelvis nedenstående programkode ikke virkede:
If arrkundevaluta(nriarray) = aktuelvaluta Then
hvor arrkundevaluta(nriarray) = ”USD” og aktuelvaluta = ”USD”. Ved at gennemgå programkoden med ”F8”-tasten og vha. Debug.Print fandt jeg dog ud af, at der i filerne med valutakurser er et mellemrum (” ”) efter valutakoderne. Som løsning på dette problem implementerede jeg følgende kode: aktuelvaluta = Left(aktuelvaluta, 3)
Herefter virkede programmet umiddelbart fint. Ved yderligere afprøvning fandt jeg dog ud af, at der fra og med april var fejl i de omregnede salgsdata. Ved nogle af kunderne var valutakursen ganske enkelt ikke ganget på salget. Denne fejl skyldtes, at jeg efter kig på den første fil med valutakurser havde antaget alle valutakurs-filerne indeholdt kurser for 29 valutaer. Dette er dog ikke tilfældet – tallet varierer. Derfor har jeg implementeret koden: antalvalutaer = Range("B2", Range("B2").End(xlDown)).Count – 1 og erstattet For i = 0 To 28 med For i = 0 To antalvalutaer
Herefter virker programmet efter hensigten.
4. Samling af salgsdata
På baggrund af de omregnede salgsfiler, som er resultatet af opgave 1, skal der, jævnfør problemformuleringen, nu laves en rutine, der samler årets salgsdata i én samlet fil.

4.1 Problemanalyse og afgrænsning
Jævnfør opgaveteksten skal programmet samle salgsdata på årsbasis samt tilføje en kolonne, hvor det årlige salg til de enkelte kunder beregnes. Man kunne endvidere konstruere programmet således, at det kunne samle data for andre tidsintervaller end år (f.eks. kvartaler eller halvår). Jeg har som udgangspunkt ikke valgt at gøre dette, men denne funktionalitet vil kunne opnås med ganske få modificeringer af koden.
I dette program forudsættes det, at antallet af kunder er konstant indenfor de enkelte måneder i et givet år. Til gengæld kan programmet godt håndtere et varierende antal kunder fra år til år. På dette punkt er programmet altså delvist dynamisk og vil ikke kræve voldsomme rettelser for at gøre det fuldt dynamisk.
Brug af programmet forudsætter desuden, at subrutinen fra opgave 1 er gennemført succesfuldt for alle månederne i dét år, man ønsker at samle data for, dvs. at der foreligger omregnede salgsfiler for alle årets 12 måneder.
4.2 Løsningsmetode
Ved udarbejdelse af programmet er jeg gået ud fra følgende plan:
- En dialogboks beder brugeren om at vælge en fil med omregnede salgsdata for det år, som der skal samles salgsdata for. Hvis brugeren ikke vælger en fil, afbrydes programmet.
- Udfra navnet på den valgte fil finder programmet ud af, hvilket år der skal samles salgsdata for.
- En For-løkke henholdsvis åbner de 12 salgsfiler for det pågældende år én af gangen, sorterer filen efter kundenummer i stigende orden, kopierer kolonnen med månedens salg over i filen med det samlede salg og lukker til sidst den åbnede salgsfil. En If-sætning sørger for, at kolonnen med kundenumre også kopieres med, hvis der er tale om den første salgsfil i rækken.
- Dernæst laves en kolonne med årets samlede salg til hver enkelt kunde, og derefter laves en række med de enkelte måneders samlede salg samt årets samlede salg.
- Til sidst gemmes filen med navnet ”samletsalg[ÅRSTAL].xls, hvor [ÅRSTAL] er det pågældende årstal.

4.3 Implementering og afprøvning
Den færdige kode til dette program fremgår af bilag 2, hvor der også kan findes uddybende kommentarer til de enkelte kodestumper. Det skal desuden bemærkes at følgende kode:
sti = omregnetsalgsdata.Path
omregnetsalgsdata.Close
først blev indsat efter implementering og afprøvning af den øvrige kode. Ved afprøvning af programmet viste det sig, at VBA tilsyneladende har problemer med at åbne en fil, som i forvejen er åben. Ovenstående kode løser dette problem ved først at gemme stien til den af brugeren åbnede fil i variablen ”sti” og dernæst lukke filen. Dermed giver det ikke fejl, når den efterfølgende For-løkke forsøger at åbne den pågældende fil igen.
5. Prognose af salg
Med udgangspunkt i filen med de samlede salgsdata laves nu en subrutine, der kan beregne det kommende års budget. Jf. problemformuleringen beregnes en given måneds budget som et gennemsnit af de foregående 5 måneder tillagt 10%.
5.1 Afgrænsning og problemanalyse
Dette program forudsætter, at programmet for opgave 2 er kørt, således at de nødvendige data til beregning af budgettet foreligger. Budgettet opstilles for de enkelte måneders samlede salg – altså ikke for hver enkelt kunde, da jeg mener, at dette vil være både uoverskueligt, upålideligt og uanvendeligt for læseren af budgettet.
Til beregning af salget i første måned af budgetåret skal programmet altså tage salget for de sidste 5 måneder i det aktuelle år, finde gennemsnittet af disse og tillægge 10%. Til beregning af næste måned i budgetåret skal programmet tage salget for de sidste 4 måneder af det aktuelle år samt den foregående måned i budgetåret, finde gennemsnittet og tillæge 10%, og så fremdeles.
En mulig løsning til dette problem kunne være at gennemløbe en For-løkke 12 gange (for de 12 måneder i budgetåret). Som tallene står i den samlede fil med salgsdata, vil dette dog umiddelbart kræve en række If-sætninger og en sådan løsning er ikke optimal.
5.2 Løsningsmetode
Jeg har i stedet valgt en løsning, hvor hver enkelt måneds salg gemmes på hver sin ”plads” i et array. Først gennemløbes en For-løkke (For i = 1 To 12) der gemmer de 12 måneders faktiske salg for det aktuelle år på de 12 første pladser i arrayet. Derefter gennemløbes en ny For-løkke (For i = 13 To 24), som beregner de 12 måneders salg i budgetåret som et gennemsnit af værdierne på de foregående 5 pladser i array’et tillagt 10%.
Budgettet skrives til ark 2 i projektmappen, og arket omdøbes til ”Budget [BUDGETÅR]”, hvor [BUDGETÅR] er det aktuelle budgetår.
Endelig gemmes projektmappen under navnet ”samletsalg[AKTUELTÅR]-budget[BUDGETÅR].xls”, hvor [AKTUELTÅR] er det aktuelle år, og [BUDGETÅR] er det aktuelle budgetår.
5.3 Implementering og afprøvning
Koden til denne sub kan ses på bilag 3, og som det fremgår, har jeg været nødt til at implementere følgende kode:
ThisWorkbook.Worksheets(2).Activate
Range("A6").Offset(1, 0).Activate
I stedet for blot at skrive:
ThisWorkbook.Worksheets(2).Range("A6").Offset(1, 0).Activate
Ved afprøvning af programmet fandt jeg nemlig ud af, at VBA tilsyneladende har problemer med at aktivere et range i et ark, som ikke er aktivt. Man er således nødt til først at aktivere det pågældende ark, og dernæst aktivere det ønskede range.
Efter implementering af ovennævnte kode virker programmet efter hensigten.
6. Præsentation af salgsdata
Som besvarelse på opgave 4 skal der laves en rutine, der kan tage imod en given måned fra brugeren, beregne hvor stor en del af det samlede salg de 10 største kunder tegnede sig for i den pågældende måned og endelig lave et lagkagediagram til illustration af fordelingen mellem de 10 største kunder.
6.1 Problemanalyse og afgrænsning
Af opgaveteksten til opgave 4 fremgår det, at dette program skal tage udgangspunkt i resultatet af opgave 2. Teknisk er det dog mere simpelt at lade programmet bygge på de omregnede salgsfiler, som er resultatet af opgave 1. Jeg mener desuden, at det er mere intuitivt for brugeren, at han/hun vælger den fil, som der ønskes en præsentation af. Endelig har denne løsning den fordel, at brugeren ikke behøver at køre både programmet fra opgave 1 og programmet fra opgave 2, før dette program kan køres (man kan nøjes med at køre programmet fra opgave 1). Med denne løsning kan man sågar køre programmet for de ikke-omregnede salgsfiler, hvis man skulle ønske dette. Derfor har jeg valgt, at min løsning af opgave 4 tager udgangspunkt i resultatet fra opgave 1.
6.2 Løsningsmetode
Præsentationsprogrammet skal udføre følgende:
- En dialogboks beder brugeren om at vælge den fil, der ønskes en præsentation af. Hvis brugeren ikke vælger en fil, afsluttes programmet.
- Den åbnede fil sorteres efter salg i faldende orden, og månedens samlede salg beregnes og gemmes i en variabel.
- Rækkerne nedenfor de 10 største kunder slettes, således at det kun er de 10 største kunder og deres salg, der fremgår af arket.
- Det samlede salg til alle kunder skrives til rækken under de 10 største kunder.
- Herefter laves en kolonne med hver enkelt af de 10 største kunders andel af det samlede salg. Beregningerne laves i en For-løkke som gennemløber de 10 rækker.
- Derefter oprettes selve lagkagediagrammet. Jævnfør vejledningen s. 201-209 i Podlin optages først en makro, hvor der laves et sådant diagram og efterfølgende foretages tilpasning af makro-koden.
6.3 Implementering og afprøvning
I denne opgave skulle der en del afprøvning og efterfølgende implementering af tilpasset kode til, før diagrammet så ud som ønsket. Det drillede især at få tilknyttet det ønskede range til ”serien”. Følgende kode gav altså en fejlmelding ved linien markeret med rød:
With ActiveChart
.ChartType = xlPie
.SetSourceData Source:=Sheets(arknavn).Range("B2:B11")
.Location Where:=xlLocationAsObject, Name:=arknavn
.SeriesCollection(1).XValues = ActiveSheet.Range("A2:A11")
End With
Hvorimod det virker efter hensigten hvis man udskiller denne linie, således at der står:
With ActiveChart
.ChartType = xlPie
.SetSourceData Source:=Sheets(arknavn).Range("B2:B11")
.Location Where:=xlLocationAsObject, Name:=arknavn
End With
.SeriesCollection(1).XValues = ActiveSheet.Range("A2:A11")
Se den endelige kode på bilag 4.
7. Placering af varehus og dynamisk genereret XY-diagram
Da opgave 6 blot er en udvidelse af opgave 5 har jeg valgt at løse de to opgaver samlet. Jævnfør problemformuleringen skal der laves et program, som finder den optimale placering af virksomhedens nye varelager, og derefter skal der dynamisk genereres et XY-diagram over den optimale placering i forhold til de involverede (europæiske) kunder.
7.1 Problemanalyse og afgrænsning
Jævnfør opgaveteksten beregnes varehusets optimale placering med følgende formler:
Hvor wi er en vægt der afspejler vigtigheden af kunde i. Jeg har valgt at benytte det samlede salg til hver enkelt kunde i 2005 som vægte. Programmet forudsætter altså, at disse data foreligger, og at programmet fra opgave 2 (”Samling af salgsdata”) er udført succesfuldt.
Mit program forudsætter desuden, at filen med kundernes koordinater samt filen med kundernes valutaer er sorteret efter kundenummer i stigende orden. Såfremt denne forudsætning ikke holder i fremtiden, vil det dog være nemt at tilpasse programmet, så det selv sorterer disse filer.
7.2 Løsningsmetode
Opgave 5 og 6 søges løst efter følgende opskrift:
- Der laves validering som, sikrer at, programmet fra opgave 2 er kørt, og dermed at de nødvendige data er til rådighed.
- Antallet af kunder findes, således at der kan dimensioneres arrays, som bruges til at gemme kundernes koordinater og valutakoder.
- En dialogboks beder brugeren om at åbne filen med kundernes koordinater, hvorefter en For-løkke sørger for at gemme hver enkelt kundes koordinater i 2 arrays, og endelig lukkes filen med kundernes koordinater.
- På tilsvarende vis beder en ny dialogboks brugeren om at åbne filen med valutakoder. En For-løkke gemmer kundernes valutakoder i et array, og dernæst lukkes filen.
- Endnu en For-løkke tjekker for hver enkelt kunde, vha. nogle If-sætninger, om denne handler i europæisk valuta. Såfremt dette er tilfældet, skal kundens data indgå i beregningen af varehusets optimale placering, og kundens koordinater skal skrives til ark3 i projektmappen.
- Den optimale placering beregnes og resultat skrives til brugeren vha. en MsgBox.
- Endelig skal koden, der genererer et XY-diagram, laves. Ligesom i opgave 4 vil jeg løse dette efter metoden beskrevet s. 201-209 i Podlin. Der optages altså en makro, hvor jeg laver det ønskede diagram, og efterfølgende tilpasses makro-koden, således at XY-diagrammet genereres dynamisk.
7.3 Implementering og afprøvning
Den endelige kode til dette program kan ses af bilag 5. Jeg har løbende afprøvet programmet, efterhånden som jeg har implementeret den nødvendige kode til løsning af de enkelte punkter i afsnit x.x. Der skulle en del afprøvning og efterfølgende tilpasning af koden til generering af XY-diagrammet, før den endelige kode var en realitet. Især tilknytning af flere ”serier” til diagrammet voldte problemer. Løsningen viste sig at være implementering af følgende kode:
With ActiveChart.SeriesCollection.NewSeries
.Name = "Optimal placering"
.Values = ActiveSheet.Range("B2")
.XValues = ActiveSheet.Range("A2")
End With
Af uforklarlige årsager gav det nemlig fejl, hvis ovenstående kode ikke var udskilt fra den øvrige chart-kode.
Efter implementering af overstående virker koden til dynamisk generering af XY-diagrammet efter hensigten.
8. Konklusion
Første opgave var at lave et program til omregning af salgsfiler fra lokal valuta til dansk valuta. Jeg har lavet et program, hvor brugeren blot skal vælge den salgsfil, som ønskes omregnet i en dialogboks. Derefter finder programmet selv ud af, hvor den til den pågældende måned hørende fil med valutakurser samt filen med valutakoder ligger placeret, åbner disse og foretager de nødvendige omregninger (bl.a. vha. et par For-løkker). Samtidig bevares strukturen fra de oprindelige salgsfiler således, at outputtet kan fungere som input i opgave 2.
Efterfølgende har jeg lavet et program, som samler de omregnede salgsdata i én fil (på årsbasis). Programmet beregner desuden det årlige salg til de enkelte kunder samt årets samledede salg i en ny kolonne. Programmet forudsætter, at antallet af kunder er konstant, og at subrutinen fra opgave 1 er gennemført. Ved afprøvning af dette program fandt jeg, at VBA tilsyneladende har problemer med at åbne en fil, som er åben i forvejen. Dette løste jeg ved at gemme stien til åbnede fil, lukke filen og så efterfølgende åbne filen igen (samt de 11 andre salgsfiler for det pågældende år) vha. den gemte sti.
Dernæst har jeg konstrueret en subrutine, der med udgangspunkt i den samlede fil med omregnede salgsdata genererer et budget for det kommende år. Rent praktisk har jeg gjort dette ved først at gennemløbe en For-løkke (For i = 1 To 12), der gemmer de 12 måneders salg i det aktuelle år på på 12 første pladser i et array. Dernæst gennemløbes en ny For-løkke (For i = 13 To 24), som beregner de 12 måneders salg i budgetåret som et gennemsnit af de foregående 5 pladser i array’et tillagt 10%.
I opgave 4 valgte jeg at lade mit program tage udgangspunkt i de omregnede salgsfiler, som er resultatet af opgave 1 i stedet for at lade programmet bygge på den samlede fil med salgsdata fra opgave 2. Denne løsning var lidt nemmere at programmere, men vigtigst af alt mener jeg, at den er mere intuitiv for brugeren, da han/hun i en dialogboks blot skal vælge hvilken fil, der ønskes en præsentation af. Endelig har denne løsning den fordel, at brugeren ikke behøver at køre programmet fra opgave 2, før programmet i opgave 4 kan køres.
VBA-koden til generering af diagrammet over den indbyrdes salgsfordeling mellem de 10 største kunder har jeg lavet ved at optage en makro, hvor jeg laver den ønskede graf og derefter har jeg rettet makro-koden til, således at diagrammet genereres dynamisk.
Samme fremgangsmåde har jeg benyttet til at lave VBA-koden til generering af XY-diagrammet i opgave 6. Inden dette XY-diagram genereres, præsenterer en beskedboks den optimalte placering af varehuset, jævnfør opgaveteksten til opgave 5.
9. Litteraturliste
Bøger:
Podlin, S. 2004. Excel 2003 – programmering med VBA. 2. udgave. Forlaget Libris.

Kompendier:
Tor Beltov. 2003. NOTER TIL VIDEREGÅENDE IT. SDU.