Makroen gemmes som VBA-kode

I makroeksemplet fra sidste blog, hvor jeg optog to makroer - henholdsvis relativt og absolut – testede vi disse og så at de fungerede på hver sin måde.

Excel VBA

Via fanen UDVIKLER, som jeg aktiverede tidligere, har jeg mulighed for at skifte fra selve Excel brugerfladen til Visual Basic Editoren (kaldet VBE) - som er en integreret del af Excel. Jeg vil her nævne at VBE-værktøjet findes tilsvarende i Word, Access, Project og mange andre applikationer.  

En hurtig måde at skifte mellem Excels brugerflade og VBA-brugerfladen er ved at anvende genvejstasten [ALT] – F11.

De handlinger, som jeg foretog da jeg optog makroen ”absolut” er blevet konverteret til Visual Basic kode og er nu gemt som tekst i et Module. Husk på at en makro er en sekvens af handlinger, du har foretaget dig. Nu er denne sekvens af handlinger bare udtrykt som Visual Basic (VBA) kode.

Koden, der bliver skrevet ved optagelsen, er forskellig alt efter om du har optaget makroen relativt eller absolut. 

Hvis du vil se koden og dermed begynde at forstå den, så finder du koden skrevet for dig på ét af de før omtalte Modules. VB-Editoren opretter automatisk et nyt modul hver gang du har lukket filen og begynder at optage flere makroer. 

absolut vs relativ

 

For at prøve at forstå hvorfor det giver mening at lære programmering i VBA, vil jeg kort beskrive hvordan koden, der blev oprettet i tidligere eksempel, skal forstås. 

Vi husker at begge makroer skrev bogstaverne a,b,c,d i fire celler. 

Dette ses i begge kodeeksempler i de fire linjer, der indeholder teksten:

.FormulaR1C1=”a”

Og i begge tilfælde findes lignende tekst for hver af de fire gange vi skriver bogstaverne a,b,c,d.

Hvad der imidlertid ikke fremgår af koden, er at årsagen til at jeg ikke har skrevet flere bogstaver end a,b,c,d skyldes at jeg ville skrive alfabetets bogstaver i hver celle, indtil jeg stødte ind i en celle hvor der i forvejen var skrevet tre ”XXX”.

Som det kan ses, så passer resultatet fint når makroen starter i den gule celle, men hvis makroen starter i den grå celle, så gør makroen ikke som jeg ønsker, men stopper efter bogstavet ”d”.

excel vba eksempel

DERFOR er det nødvendigt at lære at bruge VBA i Excel!

Makrooptageren kan ikke registrere betingelser - og den kan heller ikke optage valg eller løkker.

Programmeringssproget Visual Basic (VBA)

Selve syntaksen i sproget Visual Basic (VB) er for så vidt ganske begrænset og er ret hurtigt at lære. Sproget i sig selv er ikke til nogen nytte uden at det bliver kombineret med forskellige programmer som Excel, Access, Word eller andre.

Når disse programmer stiller deres objekter, egenskaber og metoder til rådighed for programmeringsværktøjet VBA, så kan VBA - ved hjælp af sprogets kontrolstrukturer - udnytte disse egenskaber og metoder til at afvikle vores makro.

Faktisk vil jeg gerne undgå at bruge udtrykket makro, for i Visual Basic (VB) -sproget er der ikke noget der hedder en makro!

Procedurer i VBA

I Visual Basic (VB) -sproget kaldes det en PROCEDURE.

Der findes tre forskellige typer af procedurer:

  • Sub–procedurer
  • Function–procedurer
  • Property–procedurer

Hvis vi vender tilbage til de eksempler jeg optog med makrooptageren, så kan vi se at det er blevet skrevet som kode i to Sub–procedurer:

  • Sub Absolut()
  • Sub Relativ()

Alt hvad makrooptageren laver for dig vil blive lavet som Sub–procedurer. 

Du kan selv skrive Function–procedurer og Property–procedurer. 

Den sidste type, Property–procedure, er betydeligt mere avanceret at skrive - og af flere årsager ikke så anvendt i Excel.  

Kontrolstrukturer i VBA

Kontrolstrukturer i Visual Basic er kodestrukturer, der bestemmer kodeafviklingens rækkefølge og som består af løkker og valg-strukturer. Både løkker og valg hænger sammen med betingelser og udsagn.

Med udgangspunkt i det tidligere eksempel med makrooptageren og med start i den gule celle, så vil jeg forsøge at beskrive hvad jeg rent faktisk forsøgte at få makrooptageren til at optage for mig:

Med start i den gule celle, vil jeg skrive et bogstav i hver celle og derefter hoppe en celle nedad - (selve handlingen)
Dette vil jeg fortsætte med -(løkken)
Indtil jeg møder en celle, hvor der i forvejen står ”XXX”- (betingelsen)
Desværre forstod makrooptageren ikke min hensigt og gav mig derfor en kode, der til altid vil skrive de fire bogstaver a,b,c,d.

Udsagn i VBA

Vi kender udsagn fra vores hverdag. Når jeg for eksempel skriver:

”a” i celle C3 med farvekode 65535 

- så er det et udsagn, der i dette tilfælde er sandt. I kodeeksemplet herunder er lavet fire små udsagn. 

true or false udsagn

Hvis cellemarkøreren står i den gule celle fra tidligere, så vil det første udsagn:

• ActiveCell.Value = "Ole" ; være FALSK (Eftersom der star “a” I den gule celle)

Andet udsagn:

• ActiveCell.Address = "C3" ; være SAND (Eftersom den gule celle er celle “C3” )

Tredje udsagn:

• Range("C3").Value = "b" ; være FALSK (Eftersom der står “a” I cellen)

Det fjerde og sidste udsagn er det vi kalder et sammensat udsagn hvor begge dele af udsagnet skal være sandt for at give resultatet SAND.

• Range("c3").Interior.Color = 65535 And ActiveCell.Value = "a" ; være SAND (Eftersom celle “C3” er farvet gul, og samtidigt står det ”a” i den aktive celle.

Valg i VBA (IF sand eller falsk then)

Afhængigt af vores udsagns værdi, vil VB beslutte på hvilken måde afviklingen af koden skal fortsætte. Det er her vi møder vores valgstrukturer. Der findes flere strukturer, men den mest benyttede er vores IF – struktur, der kan skrives og anvendes på flere forskellige måder.  Eks. som i nedenstående:

VBA sand eller falsk

 

Løkker i VBA

Kontrolstrukturen løkker, er ligeledes styret af et udsagns værdi. Der findes flere forskellige løkker og de har hver deres særlige anvendelse. 

Når du arbejder med løkker skal du være forsigtig - for skriver du forkert kan du risikere at løkken løber løbsk og får Excel til at blokere for alt.   

Løkker i VBA loops

Der er stor forskel på hastigheden hvormed løkker afvikles, så ved større datamængder er det vigtigt at vælge den mest fordelagtige struktur. 

Afslutning 

Jeg håber at du fandt dette blogindlæg om Excel VBA nyttigt. I min næste blog vil jeg med nogle eksempler vise, hvor stor forskel der kan være på den tid det tager at afvikle en kode - afhængigt af hvilken struktur du har valgt at bruge i din kode. 

Relevante VBA kurser

Vil du komme godt igang med VBA og Visual Basic? Så kan jeg på det varmeste anbefale følgende kurser: