Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Skriva Din Första VBA-procedur | Introduktion till VBA och Excels Objektmodell
Excel VBA för affärsautomatisering

Skriva Din Första VBA-procedur

Svep för att visa menyn

Att spela in makron lär dig vokabulär; att skriva ett från grunden är där du börjar tänka som en programmerare.

Anatomin av en Sub-procedur

Varje återanvändbar kodblock i VBA som utför en åtgärd (snarare än att returnera ett värde, vilket är en Function) skrivs som en Sub:

Sub ProcedureName()
    ' instructions go here
End Sub

Med markören någonstans inne i en Sub, tryck på F5 (eller klicka på den gröna Kör-pilen) för att köra den. Kommentarer — varje rad som börjar med en apostrof (') — ignoreras helt av VBA; använd dem generöst för att förklara varför koden gör något, inte bara vad den gör, eftersom vad oftast är uppenbart när man läser koden.

Formateringsvanor som ger omedelbar utdelning

  • Skriv Option Explicit allra högst upp i varje modul — det tvingar dig att deklarera varje variabel, vilket fångar stavfel innan de blir buggar;
  • Indrag av kod inuti loopar och If-block med en Tab — VBE kräver inte detta, men oindragen kod blir snabbt oläslig;
  • Använd beskrivande namn (HighEarnerCount, inte x) — du kommer att tacka dig själv om tre veckor.

Genomgång: Markera höginkomsttagare

Vi skriver, för hand, en procedur som går igenom varje anställd i tabellen och markerar alla som tjänar över $55,000 — något makroinspelaren aldrig kan göra, eftersom det kräver ett beslut (en If-sats) som upprepas för varje rad (en loop).

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
Genomgång rad för rad
expand arrow
  • Dim ws As Worksheet / Dim i As Long — dessa deklarerar två variabler: ws kommer att hålla en referens till Employees sheet, och i kommer att räkna igenom raderna;
  • Set ws = ThisWorkbook.Worksheets("Employees") — detta är objektmodellens vana: namnge bladet explicit istället för att förlita dig på det som råkar vara aktivt;
  • ws.Cells(ws.Rows.Count, 1).End(xlUp).Row — en standardmetod för att hitta sista använda raden i kolumn A, oavsett hur många anställda som finns i tabellen;
  • For i = 2 To lastRow ... Next i — en loop som upprepar koden en gång för varje datarad, med start på rad 2 för att hoppa över rubriken;
  • If ws.Cells(i, 6).Value > 55000 Then — ett beslut: endast rader där kolumnen Salary (kolumn 6) överstiger 55000 formateras;
  • MsgBox — en enkel popup som bekräftar att makrot är klart.

Skriv in denna procedur i modIntro, placera markören inuti och tryck på F5. Kontrollera siffrorna själv — Emma Davis och Olivia Brown är de två anställda som tjänar över $55,000 i exempeltabellen.

Uppgift

  1. Skriv in HighlightTopEarners exakt som det visas i modIntro och kör det. Bekräfta att två rader blir gröna.
  2. Duplicera proceduren som HighlightITDepartment och ändra villkoret så att den markerar alla rader där avdelningen (kolumn 3) är "IT" istället för att kontrollera lön.
  3. Lägg till en kommentar ovanför varje procedur som förklarar, i en mening, vad den gör — öva på att skriva kommentarer för läsaren, inte för dig själv.
  4. Spara arbetsboken igen (den är fortfarande .xlsm, så en vanlig Ctrl+S räcker).
Tips
expand arrow
  1. Markera hela HighlightTopEarners-proceduren (från Sub till End Sub), kopiera den och klistra in den direkt under sig själv i modIntro.
  2. Byt namn på den andra kopians Sub-rad till Sub HighlightITDepartment() — varje procedur i en modul måste ha ett unikt namn, annars vet inte VBA vilken du menar när du försöker köra den.
  3. Villkoret som ska ändras är If-raden. Just nu kontrollerar den ett tal:
If ws.Cells(i, 6).Value > 55000 Then

Du behöver istället kontrollera text — kolumn 3 (Department) ska vara lika med "IT". Kom ihåg från kapitel 2 att textjämförelser kräver citattecken runt värdet du jämför med, och använd = istället för >. 4. Allt annat inne i loopen (raden med Interior.Color, själva loopstrukturen) kan vara exakt likadant — det är bara villkoret som testas som ändras.

Lägga till kommentarer

  1. En kommentarrad börjar med en apostrof (') och står på en egen rad direkt ovanför Sub-raden — inte inne i proceduren.
  2. Skriv den som om du förklarar makrot för en kollega som aldrig sett det, inte som en påminnelse till dig själv. Jämför:
    • Mindre användbart: ' loops through rows (beskriver hur, vilket koden redan visar)
    • Mer användbart: ' Highlights employees earning over $55,000 (beskriver vad den åstadkommer, vilket inte är uppenbart vid en snabb blick)
  3. Gör samma sak för den andra proceduren — en mening som beskriver vad den markerar och varför, utifrån affärssyftet (IT-avdelningens personal), inte loopens 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

Skriv in båda i modIntro, kör först HighlightTopEarners och bekräfta att exakt två rader blir gröna (Emma Davis på $62,000 och Sophia Miller på $59,000 — de övriga tre ligger på eller under $55,000), kör sedan HighlightITDepartment och bekräfta att Sophia Millers rad markeras istället. Spara med Ctrl+S när båda fungerar.

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 1. Kapitel 6

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

Avsnitt 1. Kapitel 6
some-alt