Fuld guide til VBA i Excel – Lær if statements, loops og meget mere
Ville du takke ja til en personlig robot der klarer 80% af dine Excel-arbejdsopgaver for dig?
Det lyder for godt til at være sandt…
Men det er det faktisk ikke!
Med kodesproget VBA kan du bygge din helt egen robot, der arbejder for dig i Excel.
Det kan være svært at finde hoved og hale i VBA.
Læs derfor denne guide hvor du lærer VBA fra bunden – trin for trin.
Det lærer du
Hvad er VBA?
Makroer er koder der automatiserer arbejdsopgaver i et program – og makroer består af VBA kode.
Du kan bygge dine makroer så de gør præcist hvad du ønsker, med blot et klik på en knap.
En makro erstatter handlinger du selv foretager dig manuelt… For eksempel at formatere celler, klargøre data til en rapport, eller lave de samme diagrammer igen og igen…
På den måde automatiserer makroer mange af dine rutineopgaver i Excel
En makro kan både optages (nemt) og skrives (sværere).
Når du optager en makro, så starter du ‘optageren’, udfører nogle handlinger i Excel’, og slutter ‘optageren’ igen.
Derefter kan du afspille det du har optaget igen og igen og igen – uden at du selv skal udføre alle handlingerne.
Hvis du ikke allerede har prøvet at optage en makro før, så klik herover og læs min guide til hvordan du gør inden du læser mere om VBA.
At optage makroer er fint hvis du vil automatisere simple processer.
Simple processer er fx at påsætte specifik formatering til nye datasæt, lave diagrammer og tilføje kolonner.
Men hvis du vil automatisere noget der bliver lidt mere komplekst, så skal du bruge programmeringssproget ‘VBA’ til at skrive makroen.
VBA står for Visual Basic for Applications og blev udviklet af Microsoft i tidernes morgen…
Når du kan skrive VBA, er der stort set ingen grænser for hvad du kan bygge af avancerede og automatiske Excel-systemer.
VB Editoren
VBA/VB Editoren (kært barn har mange navne) er det sted hvor dine makroer opbevares (i VBA sprog) og er et bagvedliggende lag til den normale Excel brugerflade vi alle kender.
Du åbner VB editoren med genvejstasten Alt + F11
Har du MAC? Så er det Fn + Shift + F11
Hvis du allerede har optaget en makro, ligger den i et ‘Module’ til venstre i den menu der hedder ‘Project Explorer’.
Hvis du ikke kan se ‘Project Explorer’ menuen hos dig, så gå til ‘View’ og klik på den.
Når du er inde i et ‘Module’ (dobbeltklik på det) kan du se VBA koden i højre side…
Hvis du har optaget en makro, har VB editoren automatisk konverteret dine handlinger til VBA kode
Hvis du ikke har optaget en makro, så skal du skrive din VBA kode i et ‘Module’.
Du indsætter et ‘Module’ ved at klikke på ‘Insert’ og derefter ‘Module’.
Afspil makro
Ligegyldigt om du har optaget eller selv skrevet en makro med VBA, er det vigtigt at den kan afspilles igen.
Det kan du gøre ved at trykke ‘Run’ i VB editoren
Men det kan også gøres på andre måder.
Den mest brugervenlige måde at afspille en makro på er ved at indsætte en knap i dit regneark.
Når brugeren klikker på knappen, afspilles makroen!
For at indsætte en knap, skal du lukke VB editoren og gå til ‘Indsæt’ fanen.
Vælg her en figur – og helst en der minder lidt om en knap!
Højreklik på figuren, klik på ‘Tildel makro’ og vælg den makro du vil have skal afspilles når der trykkes på knappen.
Fundamentet bag VBA
For at forstå hvordan VBA virker, skal du bruge et par minutter på at lære fundamentet bag.
Al VBA kode består af 2 af 3 elementer.
- Et objekt (på engelsk: object)
- En egenskab (på engelsk: property)
- En metode (på engelsk: method)
Objekt: Et Excel-objekt er noget du kan manipulere med i Excel. Ting du kan flytte, skrive data i, indsætte og slette. Det er fx en celle, et område med flere celler, et ark, en projektmappe eller et diagram. Typisk det man vil beskrive med et navneord/substantiv.
Egenskab: En egenskab er noget som er tilknyttet et objekt, og et typisk det man beskriver med et tillægsord/adjektiv. Dvs. at en celle er gul eller indeholder værdien 100.
Metode: En metode er en handling objektet gør (eller du gør ved objektet). Fx at kopiere det eller slette det. Typisk kan metoder beskrives som et udsagnsord/verbum.
Kan du gætte hvad denne kode gør?
Selection.Font.bold = True
Den gør skriften fed i den celle, eller det område, du har markeret inden du kører makroen.
Denne kode består af et objekt og en egenskab.
Objektet er som udgangspunkt Selection
Som altså er den celle (eller de celler) du har markeret inden du kører makroen.
Men mange objekter indeholder mindre objekter, som fx font, border og interior.
Hele objektet i denne sammenhæng er derfor Selection.Font
Egenskaben der hører til objektet er .bold = True som gør skriften i markeringen fed.
Prøv at skriv din egen lille makro, der gør skriften fed!
Åben VB editoren (Alt + F11), indsæt et modul og skriv koden:
Sub bold()
Selection.Font.bold = True
End Sub
Men hvad betyder det?
Alle makroer starter med ordet ‘Sub’ efterfulgt af navnet på makroen + en åben og en lukket parentes.
Alle makroer slutter også med ordene ‘End Sub’.
Alt hvad du skriver derimellem er hvad din makro gør!
I dette tilfælde er det at gøre skriften fed i de celler du har markeret.
Indsæt nu en knap, højreklik på den og tildel den makroen ‘bold’ (som du lige har skrevet).
Objektet: Range
Range objektet er SUPER vigtigt i VBA! Så spids ørerne.
Range objektet er simpelthen bare en celle, eller et område med celler.
Ligesom du nok kender ordet ‘Range’ fra Excel generelt.
Typisk vil du henvise til et range i din makro, hvorefter du vil udføre en handling eller ændre egenskaberne ved range objektet.
Hvis du vil gøre skriften fed i området A1:A100, i stedet for ved det valgte område (selection), så skriv:
Range(“A1:A100”).Font.bold = True
Med en anden egenskab, kan du ændre hvad der skrives i cellen/cellerne. Det gør du med ‘Value’ egenskaben.
Så får at skrive 100 i celle C5, så skriv:
Range(“C5”).Value = 100
Eller hvis det skal være i B2:D40, så skriv:
Range(“B2:D40”).Value = 100
Du kan også referere til hele kolonner:
Range(“B:D”).Value = 100
Eller en enkelt kolonne:
Range(“B”).Value = 100
Smart, ikke?
Kopier med VBA
En meget almindelig handling i Excel er at kopiere og indsætte. Og det kan du selvfølgelig også gøre med VBA!
Følg godt med, for det er en meget typisk handling at bruge VBA til, når du skal automatisere lidt større processer.
Det hele starter med et objekt!
Hvad vil du gerne kopiere? Celle A1? Så starter vi dér:
Range(“A1”).
Så langt så godt…
Nu skal du til at kopiere en celle. At kopiere er noget du gør ved cellen, og du skal derfor bruge en metode (method) som hedder ‘copy’.
For at kopiere A1, skriver du derfor:
Range(“A1”).Copy
Nemt, ikke?
Her er nogle flere eksempler:
Range(“A”).Copy –> kopierer hele kolonne A
Range(“A1:C100”).Copy –> kopierer området A1:C100
Indsæt med VBA
Kopiering er ikke meget værd hvis du ikke kan indsætte det du har kopieret et andet sted.
Indsætning kan ske på mange måder i Excel, afhængigt af hvor meget af det kopierede du vil indsætte
Men i 99% af alle tilfælde skal du blot bruge en af disse to linjer:
Indsætter som ved normal indsætning (altså inklusive formler og formatering)
Range(“det du vil indsætte”).Pastespecial
Indsætter kun værdier
Range(“det du vil indsætte”).Pastespecial xlPasteValues
Fx hvis du vil kopiere A1:A100 til kolonne C i stedet, så skriv:
Range(“A1:A100”).Copy
Range(“C1:C100”).Pastespecial
Gentag handlinger med Loops
Jeg har lige vist dig hvordan du skriver din egen makro fra bunden, i VB editoren.
Derudover har jeg lært dig smarte kodestykker, så du kan kopiere og indsætte med VBA.
Men det er blot enkelte handlinger…
Det er nok lidt svært at se hvordan de skal kunne spare dig flere timers arbejde om dagen? ⏱️
Men når du får koden til at gentage sig selv, så kan den automatisere langt større processer, på få sekunder!
Loops!
Du laver gentagne handlinger med det der i VBA termer hedder et ‘Loop’.
Der findes forskellige typer af loops men her viser jeg dig det mest populære og fleksible loop.
Det hedder et For Loop.
Åben øvelsesfilen og gå til arket ‘Medarb.data 1’.
Her Har vi som udgangspunkt en almindelig lille datatabel med medarbejdere i en virksomhed samt noget tilhørende data for hver medarbejder.
Denne data er blevet eksporteret fra et andet software program, og som du kan se er der gået noget galt under eksporten.
Hver anden række er blevet rykket en kolonne til højre
I dette lille ark, kan du nemt fikse det på 1 minut. Men hvad nu hvis der er 10.000 rækker? Det vil tage alt for lang tid at gøre manuelt.
Lad os lave et loop der fikser det hele for dig!
Åben modulet ‘Loops’, skriv denne kode og se min forklaring i punkterne under billedet.
Forklaring
Trin 1
Denne linje markerer celle A1 før at sørge for at makroen starter det rigtige sted.
Trin 2
‘For i = 1 to 50′ bestemmer hvor mange gange loop’et skal køre.
Bogstavet i repræsenterer hvor mange gange loopet har kørt, og forøges med 1 hver gange loopet kører. I dette tilfælde kører loopet 50 gange.
Hvis det skal køre 100, så skriv 100 i stedet for 50. 50 gange er for mange til dette datasæt med kun 20 rækker, men det er ok at være på den sikre side i sådanne små makroer.
Hvis datasættet nu havde 10.000 rækker, skulle loopet køre 5.000 gange (da det kun er hver anden række der skal gøres noget ved…).
Trin 3
Denne linje gør at første celle i rækken 2 rækker under den aktive række markeres. Hvis det var hver 3. række den var gal med, skulle du erstatte 2 med 3 i denne kode.
Trin 4
Denne linje fortæller Excel hvad der skal gøres med den celle der nu er markeret. Her skal Excel slette cellen, sådan så cellerne til højre for cellen flyttes en kolonne til venstre. Hvis du vil gøre noget andet med de malplacerede rækker, så er det her du skal skrive det
Trin 5
‘Next’ betyder at der ikke er flere handlinger der skal foretages i loopet. Nr. 2 og 5 er derfor rammerne omkring loopet, og nr. 3 og 4 er hvad der sker inden i loopet.
Prøv makroen!
Indsæt en knap (figur) i dit ark og tildel den din nye makro som du selv har skrevet
Når du trykker på knappen, skal det gerne se sådan her ud:
Nu fjerner VBA koden de fejlagtigt indsatte celler, så datasættet atter er brugbart.
Hvis du har et stort datasæt er dette meget hurtigere end at gøre det manuelt ⏱️
Og hvis det sker igen og igen, kan du altid hive din makro frem og fikse det!
Tilsæt logik til din kode:
if statements
Logik er hvad der giver liv til din kode og gør det til mere end en maskine der kan udføre simple handlinger og gentage sig selv.
Logik er hvad der (næsten!) gør et Excel-ark til et menneske ved at lade det tage beslutninger.
Lad os bruge det til at automatisere noget
Du kender Excel-funktionen HVIS, ikke?
Den indfører logik til dine formler, så de kan tage små beslutninger.
Når du skal have din kode til at tage beslutninger skal du bruge det der hedder et ‘if statement’.
Et if statement er for VBA hvad HVIS funktionen er for en formel!
Hvis du ikke er rimelig skarp på HVIS funktionen får du svært ved dette afsnit.
Jeg har heldigvis skrevet en guide til HVIS funktionen, som gør dig 100% klar til if statements.
Et if statement i et loop
Du kan kombinere if statements og loops til at lave en robot (makro) der kan gentage handlinger, og samtidigt tænke sig om…
Det lyder næsten som et menneske, ikke?
Lad os gøre eksemplet lidt mere komplekst.
I det tidligere eksempel havde hver anden celle flyttet sig en kolonne til højre under eksporten fra det andet program (ERPS).
Nu har nogle af rækkerne forskudt sig 2 kolonner til højre!
Og vi ved tilmed ikke engang på forhånd hvilke rækker det er – det skifter fra række til række.
Puha, sikket rod
Gå nu til arket der hedder ‘Medarb.data 2’ i øvelsesfilen, og se hvordan det ser ud.
Nu skal du kombinere et loop og et if statement til at få datasættet til at være brugbart igen.
Lad os lige definere hvad vi vil gøre:
Vi starter i celle A1. Så går vi 1 række ned og tjekker for om rækken har forskubbet sig 1 eller 2 kolonner. Derefter flytter vi rækken 1 eller 2 kolonner til venstre. Dette gøres igen og igen, indtil data står hvor den skal.
Lad os oversætte det til VBA kode!
Først starter vi med et simpelt ‘For loop’ som du lærte lige før:
Skriv nu et if statement inden i loopet.
Dette if statement skal tjekke for hvor meget rækken har forskubbet sig og derefter rette det til.
Koden kommer til at se sådan her ud (forklaring følger under billedet):
Forklaring
Trin 1
Denne gang bruges Offset(1,0) da vi nu skal tjekke hver række igennem, i stedet for kun hver anden.
Trin 2
Et if statement starter altid med if efterfulgt af et kriterie. Kriteriet er her om cellen i kolonne B er tom. Hvis den er så angiver Then hvad der så skal ske! I så fald har rækken forskubbet sig 2 kolonner, og ‘Delete’ metoden bruges 2 gange for at få rækken på plads.
Trin 3
Hvis ikke kriteriet er overholdt – altså hvis der rent faktisk er noget i cellen i kolonne B, så hvis cellen i kolonne A er tom, så bruges ‘Delete’ metoden en enkelt gang for at få rækken på plads.
Trin 4
Hvis hverken kriteriet i punkt 2 eller 3 er overholdt, er det fordi rækken ser ud som den skal og der skal ingenting gøres.
Trin 5
Et if statement skal altid slutte med ‘End if’ – ellers virker koden ikke.
Put derefter makroen på en knap.
Og så ser det sådan her ud når du kører den:
Bonus tip
I eksemplet arbejder vi med 3 scenarier:
- At rækken er forskudt med 2 kolonner
- At rækken er forskudt med 1 kolonne
- At rækken slet ikke er forskudt
Hvis du har endnu flere scenarier, er det en fordel at bruge en anden form for kode end et if statement.
Nemlig Select Case!
Sådan!
Du klarede det!
Din helt egen makro, du selv har skrevet, som både kan gentage handlinger (loop) og tænke selv (if statement)!
Godt gået
Prøv at forestil dig hvor mange af dine Excel-arbejdsopgaver der består af gentagne handlinger + valg
Mange af dem kan du automatisere med loops og if statements – og en masse andre af de VBA tricks du har lært i denne guide.
Vil du lære endnu mere om VBA? Så læs mere om vores VBA-kursus her!