Lusse in VBA

Daar is situasies wanneer 'n VBA-program vereis word om dieselfde stel aksies 'n paar keer in 'n ry uit te voer (dit wil sê, herhaal dieselfde blok kode 'n paar keer). Dit kan gedoen word met behulp van VBA-lusse.

VBA-lusse sluit in:

Vervolgens sal ons elkeen van hierdie siklusse van naderby bekyk.

Vir Loop Operator in Visual Basic

Die struktuur van die lusoperateur Die in Visual Basic kan in een van twee vorme georganiseer word: as 'n lus Vir ... Volgende of as 'n lus Vir elke.

Siklus "Vir ... Volgende"

Cycle Vir ... Volgende gebruik 'n veranderlike wat opeenvolgend waardes uit 'n gegewe reeks neem. Met elke verandering van die waarde van die veranderlike, word die aksies wat in die liggaam van die siklus ingesluit is, uitgevoer. Dit is maklik om te verstaan ​​uit 'n eenvoudige voorbeeld:

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

In hierdie eenvoudige lus Vir ... Volgende veranderlike gebruik word i, wat opeenvolgend die waardes 1, 2, 3, … 10 neem, en vir elk van hierdie waardes word die VBA-kode binne die lus uitgevoer. Dus, hierdie lus som die elemente van die skikking op. iArray in veranderlike Totaal.

In die voorbeeld hierbo word die lus-inkrement nie gespesifiseer nie, dus om die veranderlike te verhoog i van 1 tot 10, is die verstek 'n inkrement 1… In sommige gevalle is dit egter nodig om verskillende inkrementwaardes vir die lus te gebruik. Dit kan gedoen word deur die sleutelwoord te gebruik stapsoos getoon in die volgende eenvoudige voorbeeld.

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

Aangesien in die voorbeeld hierbo is die inkrementstap gelyk gestel aan 0.1, dan die veranderlike dTotaal vir elke herhaling van die siklus neem die waardes 0.0, 0.1, 0.2, 0.3, ... 9.9, 10.0 aan.

Om die lusstap in VBA te bepaal, kan jy byvoorbeeld 'n negatiewe waarde gebruik, soos volg:

Vir i = 10 tot 1 Stap -1 iArray(i) = i Volgende i

Hier is die verhoging -1, dus die veranderlike i met elke herhaling van die siklus neem die waardes 10, 9, 8, … 1 aan.

Loop "Vir Elke"

Cycle Vir elke soortgelyk aan 'n siklus Vir ... Volgende, maar in plaas daarvan om oor die volgorde van waardes vir die tellerveranderlike, die lus, te herhaal Vir elke voer 'n stel aksies uit vir elke voorwerp in die gespesifiseerde groep voorwerpe. In die volgende voorbeeld, gebruik 'n lus Vir elke noem alle velle in die huidige Excel-werkboek:

Dim wSheet as werkblad vir elke wSheet in werkblaaie MsgBox "Найден лист: " & wSheet.Name Volgende wSheet

Lus-onderbreking stelling "Verlaat vir"

operateur Uitgang vir gebruik om die siklus te onderbreek. Sodra hierdie stelling in die kode teëgekom word, beëindig die program die uitvoering van die lus en gaan voort met die uitvoering van die stellings wat in die kode is onmiddellik na hierdie lus. Dit kan byvoorbeeld gebruik word om na 'n spesifieke waarde in 'n skikking te soek. Om dit te doen, met behulp van 'n lus, word elke element van die skikking geskandeer. Sodra die vereiste element gevind is, hoef u nie deur die res te kyk nie - die siklus word onderbreek.

Operator aansoek Uitgang vir gedemonstreer in die volgende voorbeeld. Hier herhaal die lus meer as 100 skikkinginskrywings en vergelyk elkeen met die waarde van die veranderlike dVal… As 'n passing gevind word, dan word die lus beëindig:

Vir i = 1 tot 100 As dWaardes(i) = dWaarde dan IndexVal = i Uitgaan vir einde as volgende i

Die Do While Loop in Visual Basic

Cycle Doen terwyl voer 'n blok kode uit solank aan die gespesifiseerde voorwaarde voldoen word. Die volgende is 'n voorbeeld van 'n prosedure sub, waarin die gebruik van die lus Doen terwyl Fibonacci-getalle wat nie 1000 oorskry nie, word opeenvolgend vertoon:

'Sub-prosedure voer Fibonacci-getalle uit wat nie 1000 oorskry nie. van die volgorde Dim iStep As Integer 'stoor grootte van volgende inkrement 'initialiseer veranderlikes i en iFib_Next i = 1 iFib_Next = 0 'Do While lus sal uitgevoer word totdat waarde van 'huidige Fibonacci-getal groter is as 1000 Doen Terwyl iFib_Next < 1000 As i = 1 Dan 'spesiale geval vir eerste element iStep = 1 iFib = 0 Anders 'stoor die grootte van die volgende inkrement voordat 'die huidige waarde van die ry oorskryf' iStep = iFib iFib = iFib_Next End As 'druk die huidige Fibonacci-nommer in kolom A van die aktiewe werkblad 'in die ry met indeks i Cells(i , 1).Value = iFib 'bereken die volgende Fibonacci-getal en verhoog die elementposisie-indeks met 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

In die gegewe voorbeeld, die toestand iFib_Next < 1000 aan die begin van die lus nagegaan. Daarom, as die eerste waarde iFib_Volgende As daar meer as 1000 was, sou die lus nooit uitgevoer word nie.

Nog 'n manier om 'n lus te implementeer Doen terwyl - plaas die toestand nie aan die begin nie, maar aan die einde van die lus. In hierdie geval sal die lus ten minste een keer uitgevoer word, ongeag of die voorwaarde nagekom word.

Skematies, so 'n siklus Doen terwyl met die toestand wat aan die einde nagegaan moet word, sal soos volg lyk:

Doen ... Loop Terwyl iFib_Next < 1000

Prent «Doen tot» in Visual Basic

Cycle Doen Tot baie soortgelyk aan siklus Doen terwyl: die blok kode in die liggaam van die lus word oor en oor uitgevoer totdat die gespesifiseerde voorwaarde nagekom word (die resultaat van die voorwaardelike uitdrukking is True). In die volgende prosedure sub met behulp van 'n siklus Doen Tot haal waardes uit alle selle in 'n kolom A werkblad totdat die kolom 'n leë sel teëkom:

iRow = 1 Doen totdat IsEmpty(Cells(iRow, 1)) 'Die waarde van die huidige sel word in die skikking gestoor dCellValues ​​dCellValues(iRow) = Cells(iRow, 1).Waarde iRow = iRow + 1 Loop

In die voorbeeld hierbo, die toestand IsLeeg(Selle(iRow, 1)) geleë aan die begin van die struktuur Doen Tot, so die lus sal ten minste een keer uitgevoer word as die eerste sel wat geneem is nie leeg is nie.

Maar, soos getoon in die lus voorbeelde Doen terwyl, in sommige situasies is dit nodig dat die lus ten minste een keer uitgevoer word, ongeag die aanvanklike resultaat van die voorwaardelike uitdrukking. In hierdie geval moet die voorwaardelike uitdrukking aan die einde van die lus geplaas word, soos volg:

Doen ... Loop totdat IsLeeg (Selle(iRow, 1))

Lewer Kommentaar