Menu Sluiten

VBA Do loops

Do loops macro vba excel

Indien je binnen je macro een bepaalde handeling meerdere keren achter elkaar wilt uitvoeren is het niet nodig dat je deze specifieke code meerdere keren achter elkaar plakt in je script. Je plaatst deze code dan simpelweg in een loop. Binnen VBA heb je twee soorten loops waar je van gebruik kunt maken. De eerste is de ‘For Next‘ loop. Het alternatief is de ‘Do‘ loop. In dit artikel zal ik een beschrijving geven van de soorten Do loops en voorbeelden geven van situaties waarin je deze soorten Do loops binnen een macro kunt toepassen.

De definitie van VBA Do loops

Met de Do loop geef je aan dat je een bepaald stuk code moet blijven herhalen totdat aan een bepaalde conditie voldaan is. Zorg dat je de code die binnen de loop staat inspringt om je script goed leesbaar te houden. Je hebt van de Do loop twee verschillende soorten.

De Basis Syntax van een VBA Do Loop

Er zijn verschillende manieren om een Do Loop in VBA te schrijven, maar ze volgen allemaal een vergelijkbaar patroon:

Do [{While | Until} voorwaarde]
   [statements]
Loop

OF

Do
   [statements]
Loop [{While | Until} voorwaarde]

VBA Do While loop

Met deze loop geef je aan dat het stuk code dat binnen deze loopt valt uitgevoerd moet worden zolang aan een bepaalde conditie voldaan blijft worden. Ik zal dit duidelijker maken aan de hand van een voorbeeld:

Sub testDOwhileLoop()

    Do While x < 5
        x = x + 1
        MsgBox x
    Loop

End Sub

In het bovenstaande voorbeeld zal het script vijf keer in een berichtbox de waarde van x laten zien. De loop blijft zich namelijk herhalen zolang x kleiner dan vijf is. Na de eerste loop krijgt x een waarde van één. vervolgens laat de msgbox de waarde van x zien. Daarna schiet de loop weer terug naar het begin waar hij vervolgens weer controleert of de waarde van x nog steeds kleiner dan vijf is. Na één loop is de waarde van x één dus hij voldoet nog steeds aan deze conditie. Vervolgens wordt x 1+1 dus 2 en de msgbox laat wederom de waarde zien. Deze loop gaat door totdat x vijf is geworden. Op het moment dat de loop dan terug schiet naar het begin constateert hij dat X op dat moment niet meer kleiner dan vijf is. De code springt dan uit de loop.

Do Until loop

Met deze loop geef je aan dat het stuk code dat binnen deze loopt valt uitgevoerd moet worden totdat aan een bepaalde conditie voldaan blijft worden. Ik zal dit wederom duidelijker maken aan de hand van een voorbeeld dat lijkt op het voorgaande voorbeeld zodat je duidelijk het verschil kunt zien tussen de twee soorten:

Sub testDOuntilLoop()

    Do until x = 5
        x = x + 1
        MsgBox x
    Loop

End Sub

In dit geval blijf je een stuk code herhalen totdat x de waarde van 5 krijgt. Heeft x dan wel de waarde van 5 dan springt hij uit de loop.

Do Loop While

Een ‘Do Loop While’ in VBA voert eerst de instructies binnen de loop uit en controleert vervolgens de voorwaarde aan het einde. Als de voorwaarde WAAR is, gaat het door met herhalen.

Hier is een eenvoudig voorbeeld van het gebruik van de ‘Do Loop While’ constructie:

Scenario: We willen een reeks getallen afdrukken van 1 tot 10 met behulp van VBA.

Sub PrintNummers()

    Dim nummer As Integer
    nummer = 1

    Do
        Debug.Print nummer   'Dit zal het nummer afdrukken naar het Immediate venster in VBA
        nummer = nummer + 1
    Loop While nummer <= 10

End Sub

Wanneer je deze macro uitvoert, zal het getallen van 1 tot 10 afdrukken in het Immediate venster van de VBA-editor.

Het belangrijke hier is dat de loop altijd ten minste één keer zal worden uitgevoerd, omdat de voorwaarde pas na de eerste uitvoering wordt gecontroleerd. Dit kan nuttig zijn in scenario’s waar je wilt dat de loop wordt uitgevoerd voordat de voorwaarde wordt getest.

VBA Do Loop Until

De ‘Do Loop Until’ in VBA werkt op een vergelijkbare manier als ‘Do Loop While’, maar met een tegenovergestelde logica. Het zal de instructies in de loop blijven uitvoeren totdat de voorwaarde waar wordt.

Laten we dezelfde taak als eerder gebruiken: het afdrukken van een reeks getallen van 1 tot 10 met behulp van VBA. Maar dit keer gebruiken we de ‘Do Loop Until’ constructie.

Sub PrintNummers()

    Dim nummer As Integer
    nummer = 1

    Do
        Debug.Print nummer   'Dit zal het nummer afdrukken naar het Immediate venster in VBA
        nummer = nummer + 1
    Loop Until nummer > 10

End Sub

In dit geval zal de loop blijven herhalen totdat de waarde van ‘nummer’ groter is dan 10. Net als de ‘Do Loop While’ constructie, wordt de voorwaarde in ‘Do Loop Until’ getest na de uitvoering van de loop-instructies, wat betekent dat de loop altijd ten minste één keer zal worden uitgevoerd.

Pas hiervoor op bij het toepassen van VBA Do Loops

Het gevaar bij een do loop (en dit is tevens de reden dat ik liever de For loop gebruik) zit hem in het feit dat je een oneindige loop kunt creëren. Indien je namelijk je code binnen je Do while loop zo schrijft dat hij altijd aan deze conditie blijft voldoen dan zal je script nooit je loop verlaten. Dit resulteert er dan in dat je Excel sessie zal bevriezen. In het ergste geval rest je dan niets anders dan Excel helemaal af te sluiten. Al je werk dat op dat moment niet opgeslagen is ben je dan kwijt.  In de meeste gevallen kun je echter op het moment dat de uitvoering van je code blijft hangen de Escape toets ingedrukt houden. Vervolgens krijg je dan een bericht te zien waar je de run van je script mee kunt afsluiten


Sub testOneindigeDOloop()

    x = 11
    
    Do While x > 10
        x = x + 1
    Loop

End Sub

In het bovenstaande voorbeeld blijft je script oneindig in de loop hangen omdat x bij de start al groter dan tien is en bij iedere loop alleen maar groter wordt.

Heeft dit artikel je geholpen?

4 reacties

  1. Pingback:Bestand en folder acties uitvoeren met een macro - Macro Excel Advies

  2. Pingback:For loops binnen een macro gebruiken - Macro Excel Advies

  3. Pingback:Bestand openen met een macro - Macro Excel Advies

  4. Pingback:Via VBA communiceren met een database -

Geef een reactie

Je e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *