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

Skrive Din Første VBA-prosedyre

Sveip for å vise menyen

Å spille inn makroer lærer deg vokabularet; å skrive en fra bunnen av er der du begynner å tenke som en programmerer.

Oppbygningen av en Sub-prosedyre

Hver gjenbrukbar blokk med VBA-kode som utfører en handling (i motsetning til å returnere en verdi, som en Function) skrives som en Sub:

Sub ProcedureName()
    ' instructions go here
End Sub

Med markøren hvor som helst inne i en Sub, trykk F5 (eller klikk på den grønne Kjør-pilen) for å kjøre den. Kommentarer — enhver linje som starter med en apostrof (') — ignoreres fullstendig av VBA; bruk dem flittig for å forklare hvorfor koden gjør noe, ikke bare hva den gjør, siden hva som skjer vanligvis er åpenbart ved å lese koden selv.

Formateringsvaner som gir umiddelbar gevinst

  • Skriv Option Explicit helt øverst i hver modul — det tvinger deg til å deklarere hver variabel, noe som fanger opp skrivefeil før de blir til feil;
  • Indenter kode inne i løkker og If-blokker med én Tab — VBE tvinger deg ikke til dette, men uinnrykket kode blir raskt uleselig;
  • Bruk beskrivende navn (HighEarnerCount, ikke x) — du vil takke deg selv om tre uker.

Gjennomgangseksempel: Utheving av høytlønnede

La oss skrive, for hånd, en prosedyre som går gjennom hver ansatt i tabellen og uthever alle som tjener over $55,000 — noe makroopptakeren aldri kunne gjort, fordi det krever en avgjørelse (en If-setning) gjentatt for hver rad (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
Gjennomgang linje for linje
expand arrow
  • Dim ws As Worksheet / Dim i As Long — disse deklarerer to variabler: ws skal holde en referanse til Employees sheet, og i skal telle gjennom radene;
  • Set ws = ThisWorkbook.Worksheets("Employees") — dette er objektmodell-vanen: navngi arket eksplisitt i stedet for å stole på det som tilfeldigvis er aktivt;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — et standarduttrykk som finner siste brukte rad i kolonne A, uansett hvor mange ansatte det er i tabellen;
  • For i = 2 To lastRow ... Next i — en løkke som gjentar koden én gang for hver datarad, og starter på rad 2 for å hoppe over overskriften;
  • If ws.Cells(i, 6).Value > 55000 Then — en avgjørelse: bare rader hvor Salary-kolonnen (kolonne 6) overstiger 55000 blir formatert;
  • MsgBox — et enkelt popup-vindu som bekrefter at makroen er ferdig.

Skriv inn denne prosedyren i modIntro, plasser markøren inni den, og trykk F5. Sjekk tallene selv — Emma Davis og Olivia Brown er de to ansatte som tjener over $55,000 i eksempel-tabellen.

Oppgave

  1. Skriv inn HighlightTopEarners nøyaktig som vist i modIntro og kjør den. Bekreft at to rader blir grønne.
  2. Dupliser prosedyren som HighlightITDepartment, og endre betingelsen slik at den markerer alle rader hvor Avdeling (kolonne 3) er lik "IT" i stedet for å sjekke Lønn.
  3. Legg til en kommentar over hver prosedyre som forklarer med én setning hva den gjør — øv på å skrive kommentarer for leseren, ikke for deg selv.
  4. Lagre arbeidsboken igjen (den er fortsatt .xlsm, så vanlig Ctrl+S er tilstrekkelig).
Tips
expand arrow
  1. Marker hele HighlightTopEarners-prosedyren (fra Sub til End Sub), kopier den, og lim den rett under seg selv i modIntro.
  2. Gi den andre kopien nytt navn på Sub-linjen til Sub HighlightITDepartment() — hver prosedyre i et modul må ha unikt navn, ellers vet ikke VBA hvilken du mener når du prøver å kjøre den.
  3. Betingelsen som skal endres er If-linjen. Nå sjekker den et tall:
If ws.Cells(i, 6).Value > 55000 Then

Du må få den til å sjekke tekst i stedet — kolonne 3 (Avdeling) er lik "IT". Husk fra kapittel 2 at tekstsammenligninger må ha anførselstegn rundt verdien du sammenligner med, og bruk = i stedet for >. 4. Alt annet inne i løkken (linjen med Interior.Color, selve løkkestrukturen) kan være uendret — kun betingelsen som testes skal endres.

Legge til kommentarer

  1. En kommentarlinje starter med en apostrof (') og står på egen linje rett over Sub-linjen — ikke inne i prosedyren.
  2. Skriv den som om du forklarer makroen til en kollega som aldri har sett den før, ikke som en påminnelse til deg selv. Sammenlign:
    • Ikke så nyttig: ' går gjennom rader (beskriver hvordan, noe koden allerede viser)
    • Mer nyttig: ' Marker ansatte som tjener over $55,000 (beskriver hva den oppnår, som ikke er åpenbart ved første øyekast)
  3. Gjør det samme for den andre prosedyren — én setning som beskriver hva den markerer og hvorfor, med forretningsformål (IT-avdelingens ansatte), ikke løkkens mekanikk.
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

Skriv inn begge i modIntro, kjør først HighlightTopEarners og bekreft at nøyaktig to rader blir grønne (Emma Davis med $62,000 og Sophia Miller med $59,000 — de tre andre ligger på eller under $55,000), deretter kjør HighlightITDepartment og bekreft at Sophia Millers rad blir markert i stedet. Lagre med Ctrl+S når begge fungerer.

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 1. Kapittel 6

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

Seksjon 1. Kapittel 6
some-alt