VBA lussen in Excel: For, Do While, For Each (2026)
Kort antwoord: VBA-lussen herhalen code automatisch voor meerdere cellen, rijen of items. Gebruik
For...Nextvoor een vast aantal herhalingen,For Each...Nextvoor collections zoals cellen in een bereik, enDo While/Untilwanneer je niet vooraf weet hoeveel herhalingen nodig zijn.
In het kort
- For…Next herhaalt code een vast aantal keren met een teller
- For Each…Next loopt door alle items in een collection (cellen, werkbladen, bestanden)
- Do While…Loop herhaalt zolang een voorwaarde waar is
- Do…Loop While voert code minstens een keer uit, controleert daarna
- Do Until…Loop herhaalt totdat een voorwaarde waar wordt
- Gebruik
Exit ForofExit Doom vroegtijdig uit een loop te springen - Geneste loops zijn mogelijk maar let op de prestaties
Waarom lussen in VBA?
Stel je voor: je moet dezelfde bewerking uitvoeren op 1.000 rijen. Zonder loop zou je 1.000 regels code moeten schrijven. Met een loop schrijf je de actie een keer en laat VBA het herhalen.
Lussen zijn essentieel voor:
- Data verwerken: elke rij in een dataset controleren of aanpassen
- Rapporten genereren: meerdere werkbladen of bestanden doorlopen
- Zoeken: een waarde vinden in een groot bereik
- Opschonen: lege rijen verwijderen, fouten corrigeren
- Bulk operaties: opmaak toepassen op honderden cellen
In tegenstelling tot Excel formules die werken op celniveau, kun je met VBA-lussen complexe logica toepassen die formules niet aankunnen.
For…Next loop (teller loop)
De For...Next loop is de meest gebruikte loopstructuur. Je definieert een startnummer, eindnummer en optioneel een stapgrootte.
Basis syntaxis
For teller = start To eind
' Code die herhaald wordt
Next teller
Praktisch voorbeeld: rijen vullen
Sub VulRijen()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = "Rij " & i
Next i
End Sub
Dit vult cellen A1 tot A10 met “Rij 1” tot “Rij 10”.
Met Step (stapgrootte)
Standaard verhoogt de teller met 1. Met Step kun je dit aanpassen:
Sub OnEvenRijen()
Dim i As Long
' Alleen even rijen (2, 4, 6, 8, 10)
For i = 2 To 10 Step 2
Cells(i, 1).Interior.Color = RGB(255, 255, 0)
Next i
End Sub
Terugtellen met negatieve Step
Sub TerugTellen()
Dim i As Long
' Van 10 naar 1
For i = 10 To 1 Step -1
Debug.Print i
Next i
End Sub
Tip: Terugtellen is handig bij het verwijderen van rijen. Als je vooruit telt en rijen verwijdert, sla je rijen over doordat de indexen verschuiven.
Windows en Mac
De For...Next loop werkt identiek op Windows en Mac. Er zijn geen platformspecifieke verschillen.
For Each…Next loop (collection loop)
De For Each loop is ideaal wanneer je door alle items in een collection wilt lopen, zoals cellen in een bereik, werkbladen in een werkmap, of bestanden in een map.
Basis syntaxis
For Each item In collection
' Code voor elk item
Next item
Voorbeeld: cellen in een bereik doorlopen
Sub ControleerCellen()
Dim cel As Range
For Each cel In Range("A1:A100")
If cel.Value < 0 Then
cel.Interior.Color = RGB(255, 0, 0) ' Rood markeren
End If
Next cel
End Sub
Alle werkbladen doorlopen
Sub LijstWerkbladen()
Dim ws As Worksheet
Dim rijNr As Long
rijNr = 1
For Each ws In ThisWorkbook.Worksheets
Cells(rijNr, 1).Value = ws.Name
rijNr = rijNr + 1
Next ws
End Sub
Geselecteerd bereik doorlopen
Sub BewerkSelectie()
Dim cel As Range
' Werkt op wat de gebruiker heeft geselecteerd
For Each cel In Selection
cel.Value = UCase(cel.Value) ' Hoofdletters maken
Next cel
End Sub
For Each vs For…Next
| Aspect | For Each | For…Next |
|---|---|---|
| Snelheid | Meestal sneller voor collections | Beter voor genummerde iteraties |
| Leesbaarheid | Zeer leesbaar | Duidelijk voor tellingen |
| Flexibiliteit | Geen indexcontrole | Volledige controle over index |
| Gebruik | Collections, bereiken | Getalbereiken, arrays |
Best practice: Gebruik For Each wanneer je door alle items in een collection moet, en For...Next wanneer je een specifieke index of stapgrootte nodig hebt.
Do While…Loop (voorwaarde eerst)
De Do While loop herhaalt code zolang een voorwaarde waar (True) is. De voorwaarde wordt gecontroleerd voordat de code wordt uitgevoerd.
Basis syntaxis
Do While voorwaarde
' Code die herhaald wordt
Loop
Voorbeeld: lege cellen zoeken
Sub VindEersteLegeCel()
Dim rijNr As Long
rijNr = 1
Do While Cells(rijNr, 1).Value <> ""
rijNr = rijNr + 1
Loop
MsgBox "Eerste lege cel in kolom A: rij " & rijNr
End Sub
Data importeren tot einde
Sub LeesDataTotEinde()
Dim rijNr As Long
rijNr = 1
Do While rijNr <= 1000 And Cells(rijNr, 1).Value <> "EINDE"
' Verwerk de data
Cells(rijNr, 2).Value = Cells(rijNr, 1).Value * 2
rijNr = rijNr + 1
Loop
End Sub
Let op: Als de voorwaarde direct False is, wordt de code in de loop nooit uitgevoerd.
Do…Loop While (voorwaarde laatst)
Bij Do...Loop While wordt de code minstens een keer uitgevoerd. De voorwaarde wordt pas na de eerste uitvoering gecontroleerd.
Basis syntaxis
Do
' Code die minstens 1x wordt uitgevoerd
Loop While voorwaarde
Voorbeeld: gebruikersinvoer valideren
Sub VraagGeldigeInvoer()
Dim invoer As String
Do
invoer = InputBox("Voer een getal tussen 1 en 10 in:")
If Not IsNumeric(invoer) Then
MsgBox "Dat is geen getal. Probeer opnieuw."
ElseIf Val(invoer) < 1 Or Val(invoer) > 10 Then
MsgBox "Getal moet tussen 1 en 10 zijn."
End If
Loop While Val(invoer) < 1 Or Val(invoer) > 10 Or Not IsNumeric(invoer)
MsgBox "Je hebt gekozen: " & invoer
End Sub
Verschil met Do While
' Dit loopt NOOIT (voorwaarde direct False)
Sub DoWhileVoorbeeld()
Dim x As Integer
x = 10
Do While x < 5
Debug.Print x
x = x + 1
Loop
' Output: niets
End Sub
' Dit loopt MINSTENS 1x
Sub DoLoopWhileVoorbeeld()
Dim x As Integer
x = 10
Do
Debug.Print x
x = x + 1
Loop While x < 5
' Output: 10
End Sub
Do Until…Loop (totdat voorwaarde waar is)
Do Until is het tegenovergestelde van Do While. De loop herhaalt totdat de voorwaarde waar wordt.
Basis syntaxis
Do Until voorwaarde
' Code die herhaald wordt
Loop
Voorbeeld: rijen doorlopen tot lege cel
Sub VerwerktTotLeeg()
Dim rijNr As Long
rijNr = 1
Do Until IsEmpty(Cells(rijNr, 1))
Cells(rijNr, 2).Value = Cells(rijNr, 1).Value * 1.21 ' BTW berekenen
rijNr = rijNr + 1
Loop
End Sub
Do…Loop Until (check na uitvoering)
Sub WachtOpWaarde()
Dim pogingen As Integer
pogingen = 0
Do
pogingen = pogingen + 1
' Simuleer een check
Loop Until Cells(1, 1).Value = "KLAAR" Or pogingen > 100
End Sub
Exit For en Exit Do
Soms moet je een loop vroegtijdig verlaten. Gebruik Exit For of Exit Do om uit de huidige loop te springen.
Exit For voorbeeld
Sub ZoekWaarde()
Dim i As Long
Dim gevonden As Boolean
gevonden = False
For i = 1 To 10000
If Cells(i, 1).Value = "GEZOCHT" Then
MsgBox "Gevonden in rij " & i
gevonden = True
Exit For ' Stop direct met zoeken
End If
Next i
If Not gevonden Then
MsgBox "Waarde niet gevonden"
End If
End Sub
Exit Do voorbeeld
Sub LeesMetTimeout()
Dim startTijd As Double
Dim rijNr As Long
startTijd = Timer
rijNr = 1
Do While Cells(rijNr, 1).Value <> ""
' Verwerk data
Cells(rijNr, 2).Value = Cells(rijNr, 1).Value
rijNr = rijNr + 1
' Timeout na 30 seconden
If Timer - startTijd > 30 Then
MsgBox "Timeout bereikt na 30 seconden"
Exit Do
End If
Loop
End Sub
Exit in geneste loops
Exit For of Exit Do verlaat alleen de binnenste loop. Voor geneste loops kun je een vlag gebruiken:
Sub ZoekInTabel()
Dim i As Long, j As Long
Dim gevonden As Boolean
gevonden = False
For i = 1 To 100
For j = 1 To 10
If Cells(i, j).Value = "X" Then
MsgBox "X gevonden in rij " & i & ", kolom " & j
gevonden = True
Exit For ' Verlaat binnenste loop
End If
Next j
If gevonden Then Exit For ' Verlaat buitenste loop
Next i
End Sub
Geneste loops (nested loops)
Geneste loops zijn loops binnen loops. Handig voor het doorlopen van tweedimensionale structuren zoals tabellen.
Voorbeeld: tabel doorlopen
Sub VulTabel()
Dim rij As Long, kolom As Long
For rij = 1 To 10
For kolom = 1 To 5
Cells(rij, kolom).Value = rij * kolom
Next kolom
Next rij
End Sub
Vermenigvuldigingstabel maken
Sub MaakTafelVan()
Dim i As Long, j As Long
' Kopteksten
For i = 1 To 10
Cells(1, i + 1).Value = i
Cells(i + 1, 1).Value = i
Next i
' Inhoud
For i = 1 To 10
For j = 1 To 10
Cells(i + 1, j + 1).Value = i * j
Next j
Next i
End Sub
Prestatie-tip voor geneste loops
Geneste loops kunnen traag zijn. Optimaliseer door:
- Schermverversing uitschakelen:
Application.ScreenUpdating = False
' ... loop code ...
Application.ScreenUpdating = True
- Berekeningen uitschakelen:
Application.Calculation = xlCalculationManual
' ... loop code ...
Application.Calculation = xlCalculationAutomatic
- Data in een array laden (veel sneller dan cel-voor-cel):
Sub SnelleVerwerking()
Dim data As Variant
Dim i As Long, j As Long
' Laad data in array (1 actie)
data = Range("A1:E1000").Value
' Verwerk in geheugen
For i = 1 To UBound(data, 1)
For j = 1 To UBound(data, 2)
If data(i, j) < 0 Then data(i, j) = 0
Next j
Next i
' Schrijf terug (1 actie)
Range("A1:E1000").Value = data
End Sub
Praktijkvoorbeeld: loop door cellen in bereik
Hier is een compleet voorbeeld dat veelvoorkomende patronen combineert.
Scenario: factuurnummers controleren
Sub ControleerFacturen()
Dim cel As Range
Dim bereik As Range
Dim foutenTeller As Long
' Zet optimalisaties aan
Application.ScreenUpdating = False
' Bepaal het bereik (dynamisch)
Set bereik = Range("A2:A" & Cells(Rows.Count, 1).End(xlUp).Row)
foutenTeller = 0
For Each cel In bereik
' Controleer of factuurnummer geldig is
If Len(cel.Value) <> 8 Then
cel.Interior.Color = RGB(255, 200, 200) ' Lichtroze
cel.Offset(0, 1).Value = "Fout: lengte niet 8"
foutenTeller = foutenTeller + 1
ElseIf Not IsNumeric(Right(cel.Value, 6)) Then
cel.Interior.Color = RGB(255, 200, 200)
cel.Offset(0, 1).Value = "Fout: geen nummer"
foutenTeller = foutenTeller + 1
Else
cel.Interior.ColorIndex = xlNone ' Geen kleur
cel.Offset(0, 1).Value = "OK"
End If
Next cel
Application.ScreenUpdating = True
MsgBox "Controle voltooid. " & foutenTeller & " fouten gevonden."
End Sub
Scenario: lege rijen verwijderen (achteruit lopen)
Sub VerwijderLegeRijen()
Dim laatsteRij As Long
Dim i As Long
Dim verwijderd As Long
Application.ScreenUpdating = False
laatsteRij = Cells(Rows.Count, 1).End(xlUp).Row
verwijderd = 0
' BELANGRIJK: loop achteruit bij verwijderen!
For i = laatsteRij To 1 Step -1
If Application.WorksheetFunction.CountA(Rows(i)) = 0 Then
Rows(i).Delete
verwijderd = verwijderd + 1
End If
Next i
Application.ScreenUpdating = True
MsgBox verwijderd & " lege rijen verwijderd."
End Sub
Veelgemaakte fouten
1. Oneindige loop (infinite loop)
Oorzaak: De voorwaarde wordt nooit False, of je vergeet de teller te verhogen.
' FOUT: oneindige loop!
Sub OneindigeFout()
Dim i As Integer
i = 1
Do While i < 10
Debug.Print i
' Vergeten: i = i + 1
Loop
End Sub
Oplossing: Zorg dat de loop altijd kan eindigen. Voeg een veiligheidsklep toe:
Sub VeiligLoop()
Dim i As Integer
Dim maxPogingen As Long
i = 1
maxPogingen = 0
Do While i < 10
Debug.Print i
i = i + 1
maxPogingen = maxPogingen + 1
If maxPogingen > 100000 Then Exit Do ' Noodstop
Loop
End Sub
Tip: Druk op Ctrl + Break (Windows) of Cmd + . (Mac) om een vastgelopen macro te stoppen.
2. Verkeerde looptype kiezen
Oorzaak: For...Next gebruiken waar For Each beter past, of andersom.
Oplossing: Gebruik For Each voor collections, For...Next voor getallen.
3. Rijen vooruit verwijderen
Oorzaak: Bij het verwijderen van rijen verschuiven de indexen, waardoor je rijen overslaat.
' FOUT: slaat rijen over!
Sub FoutiefVerwijderen()
Dim i As Long
For i = 1 To 100
If Cells(i, 1).Value = "" Then
Rows(i).Delete ' Rij 2 wordt nu rij 1
End If
Next i
End Sub
Oplossing: Loop achteruit met Step -1.
4. Integer overflow bij grote datasets
Oorzaak: Integer kan maar tot 32.767. Excel heeft tot 1.048.576 rijen.
' FOUT: overflow bij rij > 32.767
Dim i As Integer ' FOUT
For i = 1 To 100000
Oplossing: Gebruik Long voor rijtellers.
Dim i As Long ' GOED
For i = 1 To 100000
5. Geen optimalisatie bij grote loops
Oorzaak: Schermverversing en berekeningen bij elke iteratie.
Oplossing: Schakel uit aan het begin, schakel in aan het einde:
Sub GeoptimaliseerdeLoop()
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' ... je loop code ...
Application.EnableEvents = True
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End Sub
FAQ
Welke loop moet ik gebruiken?
Kies op basis van je situatie. Gebruik For...Next als je precies weet hoeveel iteraties je nodig hebt. Gebruik For Each voor collections zoals cellen of werkbladen. Gebruik Do While of Do Until als je niet vooraf weet hoeveel herhalingen nodig zijn.
Hoe stop ik een vastgelopen loop?
Op Windows druk je Ctrl + Break of Esc. Op Mac druk je Cmd + . (punt). Dit werkt niet altijd direct; soms moet je even wachten. Bouw altijd een veiligheidsklep in je loops met een maximaal aantal iteraties.
Kan ik meerdere variabelen in een For loop gebruiken?
Niet direct in VBA. Maar je kunt binnen de loop extra variabelen berekenen of meerdere geneste loops gebruiken. Voor complexe iteraties kun je een Do While loop met meerdere condities gebruiken.
Wat is sneller: For Each of For…Next?
Voor het doorlopen van bereiken is For Each meestal sneller. Voor arrays of wanneer je een specifieke index nodig hebt, is For...Next beter. Het grootste verschil zit in de leesbaarheid; prestaties zijn vergelijkbaar.
Hoe doorloop ik alleen zichtbare cellen?
Gebruik de SpecialCells methode met For Each:
For Each cel In Range("A1:A100").SpecialCells(xlCellTypeVisible)
' Alleen zichtbare cellen
Next cel
Kan ik een loop pauzeren?
Technisch niet ingebouwd, maar je kunt een DoEvents toevoegen om de interface responsief te houden. Voor echte pauzes kun je een timer gebruiken met Application.Wait.
Hoe tel ik het aantal iteraties?
Voeg een tellervariabele toe die je bij elke iteratie verhoogt. Bij For...Next is de teller al beschikbaar. Bij For Each of Do loops maak je zelf een teller = teller + 1 statement.
Werken loops hetzelfde op Mac?
Ja, VBA-loops werken identiek op Windows en Mac. Alleen sommige geavanceerde functies zoals bestandssysteem-operaties kunnen verschillen, maar de loopstructuren zelf zijn platformonafhankelijk.
Wil je met een macro gegevens uit een extern bestand halen? Lees dan tekstbestanden lezen en schrijven met VBA. Werk je met grote lijsten waarin je snel op een sleutel wilt zoeken? Bekijk dan ook het VBA Dictionary object.
Gerelateerde onderwerpen
VBA-lussen vormen de basis voor geavanceerde automatisering:
- VBA voor beginners: start met de basisconcepten van VBA
- Macro opnemen in Excel: automatiseer taken zonder te coderen
- Excel formules: combineer VBA met krachtige functies
- Voorwaardelijke opmaak: visuele feedback zonder VBA
- Duplicaten verwijderen: handmatige methoden vs. VBA-aanpak
Geen zin om zelf te puzzelen? Neem contact op voor VBA hulp. Ik help je graag. Geen tijd of zin om zelf te bouwen? Je kunt ook een Excel macro laten maken, dan staat de knop volgende week gewoon in je bestand.
Hulp nodig?
Kom je er niet uit met VBA-lussen? Of wil je een specifieke automatisering laten bouwen?
- WhatsApp: Stuur een bericht
- E-mail: w.bouwmeester@bouwmeesterconsultancy.nl
- Telefoon: +31 6 28963636
Stuur gerust je Excel-bestand mee met een korte beschrijving van wat je wilt automatiseren. We reageren meestal binnen 24 uur.
Bekijk ook: Excel hulp | VBA expert | Offerte op maat | Maatwerk spreadsheet







