Lussen in VBA

Er zijn situaties waarin een VBA-programma dezelfde reeks acties meerdere keren achter elkaar moet uitvoeren (dat wil zeggen, hetzelfde codeblok meerdere keren herhalen). Dit kan met behulp van VBA-loops.

VBA-lussen omvatten:

Vervolgens zullen we elk van deze cycli nader bekijken.

Voor lusoperator in Visual Basic

De structuur van de lusoperator De in Visual Basic kan in twee vormen worden georganiseerd: als een lus Voor de volgende of als een lus voor elk.

Cyclus “Voor … Volgende”

Cyclus Voor de volgende gebruikt een variabele die achtereenvolgens waarden uit een bepaald bereik haalt. Bij elke verandering van de waarde van de variabele worden de acties uitgevoerd die in de hoofdtekst van de cyclus zijn opgenomen. Dit is gemakkelijk te begrijpen aan de hand van een eenvoudig voorbeeld:

Voor i = 1 tot 10 Totaal = Totaal + iArray(i) Volgende i

In deze eenvoudige lus Voor de volgende variabele wordt gebruikt i, die achtereenvolgens de waarden 1, 2, 3, ... 10 aanneemt, en voor elk van deze waarden wordt de VBA-code in de lus uitgevoerd. Deze lus somt dus de elementen van de array op. iArray in variabele Totaal.

In het bovenstaande voorbeeld is de lusverhoging niet gespecificeerd, dus om de variabele te verhogen i van 1 tot 10, de standaardwaarde is een toename 1… In sommige gevallen is het echter nodig om verschillende incrementwaarden voor de lus te gebruiken. Dit kan worden gedaan met behulp van het trefwoord Stap voorzoals weergegeven in het volgende eenvoudige voorbeeld.

Voor d = 0 tot 10 Stap 0.1 dTotaal = dTotaal + d Volgende d

Aangezien in het bovenstaande voorbeeld de incrementstap gelijk is aan 0.1, dan de variabele dTotaal voor elke herhaling van de cyclus neemt de waarden 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0 aan.

Om de lusstap in VBA te bepalen, kunt u een negatieve waarde gebruiken, bijvoorbeeld als volgt:

Voor i = 10 Naar 1 Stap -1 iArray(i) = i Volgende i

Hier is de toename: -1, dus de variabele i bij elke herhaling van de cyclus krijgt de waarde 10, 9, 8, … 1.

Loop "Voor elk"

Cyclus voor elk gelijk aan een cyclus Voor de volgende, maar in plaats van de reeks waarden voor de tellervariabele te herhalen, wordt de lus voor elk voert een reeks acties uit voor elk object in de opgegeven groep objecten. In het volgende voorbeeld, met behulp van een lus voor elk somt alle bladen in de huidige Excel-werkmap op:

Dim wSheet als werkblad voor elke wSheet in Worksheets MsgBox "Найден лист: " & wSheet.Name Volgende wSheet

Loop interrupt-instructie "Exit For"

Operator Afsluiten voor gebruikt om de cyclus te onderbreken. Zodra deze instructie in de code wordt aangetroffen, beëindigt het programma de uitvoering van de lus en gaat verder met de uitvoering van de instructies die zich direct na deze lus in de code bevinden. Dit kan bijvoorbeeld worden gebruikt om naar een specifieke waarde in een array te zoeken. Om dit te doen, wordt met behulp van een lus elk element van de array gescand. Zodra het gewenste element is gevonden, hoeft u de rest niet meer door te kijken - de cyclus wordt onderbroken.

Operator applicatie Afsluiten voor aangetoond in het volgende voorbeeld. Hier herhaalt de lus meer dan 100 array-items en vergelijkt elk met de waarde van de variabele dVal… Als er een overeenkomst wordt gevonden, wordt de lus beëindigd:

Voor i = 1 tot 100 Als dValues(i) = dVal Dan IndexVal = i Exit For End If Next i

De Do While-lus in Visual Basic

Cyclus Doen terwijl voert een codeblok uit zolang aan de opgegeven voorwaarde wordt voldaan. Het volgende is een voorbeeld van een procedure: Sub, waarin het gebruik van de lus Doen terwijl Fibonacci-getallen van maximaal 1000 worden opeenvolgend weergegeven:

'Sub procedure voert Fibonacci-getallen uit die niet groter zijn dan 1000 Sub Fibonacci() Dim i As Integer' teller om de positie van het element in de reeks aan te geven Dim iFib As Integer 'slaat de huidige waarde van de reeks op Dim iFib_Next As Integer 'slaat de volgende waarde op van de reeks Dim iStep As Integer 'slaat de grootte van de volgende stap op' initialiseert variabelen i en iFib_Next i = 1 iFib_Next = 0 'Do While-lus wordt uitgevoerd totdat de waarde van 'huidig ​​Fibonacci-getal groter is dan 1000 Do While iFib_Next < 1000 If i = 1 Dan 'speciaal geval voor eerste element iStep = 1 iFib = 0 Else 'sla de grootte van de volgende stap op alvorens 'de huidige waarde van de reeks te overschrijven iStep = iFib iFib = iFib_Next End If 'druk het huidige Fibonacci-getal af in kolom A van het actieve werkblad 'in de rij met index i Cells(i , 1).Value = iFib 'bereken het volgende Fibonacci-getal en verhoog de elementpositie-index met 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

In het gegeven voorbeeld is de voorwaarde iFib_Next < 1000 gecontroleerd aan het begin van de lus. Daarom, als de eerste waarde iFib_Volgende Als er meer dan 1000 waren, zou de lus nooit worden uitgevoerd.

Een andere manier om een ​​lus te implementeren Doen terwijl - plaats de voorwaarde niet aan het begin, maar aan het einde van de lus. In dit geval wordt de lus minstens één keer uitgevoerd, ongeacht of aan de voorwaarde is voldaan.

Schematisch is zo'n cyclus Doen terwijl met de voorwaarde die aan het einde moet worden gecontroleerd, ziet er als volgt uit:

Do ... Loop While iFib_Next < 1000

икл «Doen tot» в Visual Basic

Cyclus Doen tot lijkt erg op fietsen Doen terwijl: het codeblok in de hoofdtekst van de lus wordt steeds opnieuw uitgevoerd totdat aan de opgegeven voorwaarde is voldaan (het resultaat van de voorwaardelijke expressie is Waar). In de volgende procedure Sub een cyclus gebruiken Doen tot waarden ophalen uit alle cellen in een kolom A werkblad totdat de kolom een ​​lege cel tegenkomt:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'De waarde van de huidige cel wordt opgeslagen in de array dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

In het bovenstaande voorbeeld is de voorwaarde IsEmpty(Cellen(iRow, 1)) gelegen aan het begin van de structuur Doen tot, dus de lus wordt minstens één keer uitgevoerd als de eerste cel niet leeg is.

Echter, zoals getoond in de lusvoorbeelden Doen terwijl, is het in sommige situaties noodzakelijk dat de lus minstens één keer wordt uitgevoerd, ongeacht het initiële resultaat van de voorwaardelijke expressie. In dit geval moet de voorwaardelijke expressie aan het einde van de lus worden geplaatst, zoals deze:

Do ... Loop tot het leeg is (cellen (iRow, 1))

Laat een reactie achter