Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Skrivning Af Din Første VBA-procedure | Introduktion til VBA og Excel-objektmodellen
Excel VBA til Forretningsautomatisering

Skrivning Af Din Første VBA-procedure

Stryg for at vise menuen

Optagelse af makroer lærer dig ordforrådet; at skrive én fra bunden er der, hvor du begynder at tænke som en programmør.

Opbygningen af en Sub-procedure

Hver genanvendelig blok af VBA-kode, der udfører en handling (i modsætning til at returnere en værdi, hvilket er en Function), skrives som en Sub:

Sub ProcedureName()
    ' instructions go here
End Sub

Med markøren placeret et vilkårligt sted i en Sub, tryk på F5 (eller klik på den grønne Kør-pil) for at køre den. Kommentarer — enhver linje, der starter med en apostrof (') — ignoreres fuldstændigt af VBA; brug dem flittigt til at forklare hvorfor koden gør noget, ikke kun hvad den gør, da hvad som regel er tydeligt ud fra selve koden.

Formateringsvaner, der straks betaler sig

  • Skriv Option Explicit øverst i hvert modul — det tvinger dig til at erklære alle variabler, hvilket fanger tastefejl, før de bliver til fejl;
  • Indryk kode inden for løkker og If-blokke med én Tab — VBE kræver det ikke, men uindrykket kode bliver hurtigt ulæselig;
  • Brug beskrivende navne (HighEarnerCount, ikke x) — du vil takke dig selv om tre uger.

Gennemarbejdet eksempel: Fremhævning af højtlønnede

Lad os skrive, manuelt, en procedure der gennemgår hver medarbejder i tabellen og fremhæver alle, der tjener over $55,000 — noget makrooptageren aldrig kunne gøre, fordi det kræver en beslutning (en If-sætning), der gentages for hver række (en løkke).

Option Explicit
 
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long
 
    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
 
    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i
 
    MsgBox "Done — high earners are highlighted."
End Sub
Gennemgang linje for linje
expand arrow
  • Dim ws As Worksheet / Dim i As Long — disse erklærer to variabler: ws vil indeholde en reference til Employees-arket, og i vil tælle gennem rækkerne;
  • Set ws = ThisWorkbook.Worksheets("Employees") — dette er objektmodel-vanen: navngiv arket eksplicit i stedet for at stole på det aktive ark;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — et standardudtryk, der finder den sidste anvendte række i kolonne A, uanset hvor mange medarbejdere der er i tabellen;
  • For i = 2 To lastRow ... Next i — en løkke, der gentager koden én gang for hver datarække, startende ved række 2 for at springe overskriften over;
  • If ws.Cells(i, 6).Value > 55000 Then — en beslutning: kun rækker hvor lønkolonnen (kolonne 6) overstiger 55000 bliver formateret;
  • MsgBox — en simpel pop-up, der bekræfter at makroen er færdig.

Indtast denne procedure i modIntro, placer markøren inde i den, og tryk på F5. Tjek tallene selv — Emma Davis og Olivia Brown er de to medarbejdere, der tjener over $55.000 i eksempeltabellen.

Opgave

  1. Indtast HighlightTopEarners præcis som vist i modIntro og kør den. Bekræft at to rækker bliver grønne.
  2. Dublér proceduren som HighlightITDepartment, og ændr betingelsen, så den fremhæver alle rækker, hvor Afdeling (kolonne 3) er lig med "IT" i stedet for at tjekke Løn.
  3. Tilføj en kommentar over hver procedure, der med én sætning forklarer, hvad den gør — øv dig i at skrive kommentarer til læseren, ikke til dig selv.
  4. Gem projektmappen igen (det er stadig .xlsm, så en almindelig Ctrl+S er tilstrækkelig).
Tip
expand arrow
  1. Markér hele HighlightTopEarners-proceduren (fra Sub til End Sub), kopier den, og indsæt den lige nedenunder i modIntro.
  2. Omdøb den anden kopi's Sub-linje til Sub HighlightITDepartment() — hver procedure i et modul skal have et unikt navn, ellers ved VBA ikke, hvilken du mener, når du prøver at køre den.
  3. Den betingelse, der skal ændres, er If-linjen. Lige nu tjekker den et tal:
If ws.Cells(i, 6).Value > 55000 Then

Du skal i stedet tjekke tekst — kolonne 3 (Afdeling) skal være lig med "IT". Husk fra Kapitel 2, at tekstsammenligninger kræver anførselstegn omkring værdien, du sammenligner med, og brug = i stedet for >. 4. Alt andet inde i løkken (linjen med Interior.Color, selve løkkestrukturen) kan forblive det samme — kun den betingelse, der testes, ændres.

Tilføjelse af kommentarer

  1. En kommentarlinje starter med en apostrof (') og står på sin egen linje direkte over Sub-linjen — ikke inde i proceduren.
  2. Skriv den, som om du forklarer makroen til en kollega, der aldrig har set den før, ikke som en påmindelse til dig selv. Sammenlign:
    • Ikke så nyttig: ' løber gennem rækker (beskriver hvordan, hvilket koden allerede viser)
    • Mere nyttig: ' Fremhæver medarbejdere, der tjener over $55.000 (beskriver hvad den opnår, hvilket ikke er åbenlyst ved første øjekast)
  3. Gør det samme for den anden procedure — én sætning, der beskriver, hvad den fremhæver og hvorfor, i forhold til forretningsformålet (IT-afdelingens personale), ikke løkkens mekanik.
Løsning
expand arrow
' Highlights employees earning over $55,000, to flag top earners at a glance.
Sub HighlightTopEarners()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 6).Value > 55000 Then
            ws.Cells(i, 6).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — high earners are highlighted."
End Sub

' Highlights every employee who works in the IT department.
Sub HighlightITDepartment()
    Dim ws As Worksheet
    Dim i As Long
    Dim lastRow As Long

    Set ws = ThisWorkbook.Worksheets("Employees")
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

    For i = 2 To lastRow
        If ws.Cells(i, 3).Value = "IT" Then
            ws.Cells(i, 3).Interior.Color = RGB(198, 239, 206)
        End If
    Next i

    MsgBox "Done — IT department is highlighted."
End Sub

Indtast begge i modIntro, kør først HighlightTopEarners og bekræft, at præcis to rækker bliver grønne (Emma Davis med $62.000 og Sophia Miller med $59.000 — de tre andre ligger på eller under $55.000), og kør derefter HighlightITDepartment og bekræft, at Sophia Millers række fremhæves i stedet. Gem med Ctrl+S, når begge virker.

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 1. Kapitel 6

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Sektion 1. Kapitel 6
some-alt