Løkker i VBA

Det er situasjoner når et VBA-program kreves for å utføre det samme settet med handlinger flere ganger på rad (det vil si gjenta den samme kodeblokken flere ganger). Dette kan gjøres ved hjelp av VBA-løkker.

VBA-løkker inkluderer:

Deretter skal vi se nærmere på hver av disse syklusene.

For Loop Operator i Visual Basic

Strukturen til sløyfeoperatøren De i Visual Basic kan organiseres i en av to former: som en loop For ... Neste eller som en løkke For hver.

Syklus "For ... Neste"

Syklus For ... Neste bruker en variabel som sekvensielt tar verdier fra et gitt område. Med hver endring av verdien til variabelen, utføres handlingene som er innesluttet i syklusens kropp. Dette er lett å forstå fra et enkelt eksempel:

For i = 1 til 10 Totalt = Totalt + iArray(i) Neste i

I denne enkle løkken For ... Neste variabel brukes i, som sekvensielt tar verdiene 1, 2, 3, … 10, og for hver av disse verdiene utføres VBA-koden inne i løkken. Dermed summerer denne løkken elementene i matrisen. iArray i variabel Totalt.

I eksemplet ovenfor er løkkeøkningen ikke spesifisert, så for å øke variabelen i fra 1 til 10, er standarden en økning 1… I noen tilfeller er det imidlertid nødvendig å bruke forskjellige inkrementverdier for løkken. Dette kan gjøres ved å bruke nøkkelordet Trinnsom vist i følgende enkle eksempel.

For d = 0 Til 10 Trinn 0.1 dTotal = dTotal + d Neste d

Siden i eksemplet ovenfor er inkrementtrinnet satt lik 0.1, deretter variabelen dTotalt for hver repetisjon av syklusen antar verdiene 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

For å bestemme løkketrinnet i VBA, kan du bruke en negativ verdi, for eksempel slik:

For i = 10 til 1 trinn -1 iArray(i) = i Neste i

Her er økningen -1, så variabelen i med hver repetisjon av syklusen får verdiene 10, 9, 8, … 1.

Loop "For Every"

Syklus For hver ligner på en syklus For ... Neste, men i stedet for å iterere over sekvensen av verdier for tellervariabelen, loopen For hver utfører et sett med handlinger for hvert objekt i den angitte gruppen av objekter. I følgende eksempel, bruk av en løkke For hver oppregner alle ark i gjeldende Excel-arbeidsbok:

Dim wSheet som regneark for hvert wSheet i regneark MsgBox "Найден лист: " & wSheet.Name Neste wSheet

Sløyfeavbruddserklæring "Avslutt for"

operatør Avslutt for brukes til å avbryte syklusen. Så snart denne setningen påtreffes i koden, avslutter programmet kjøringen av løkken og fortsetter til kjøringen av setningene som er i koden umiddelbart etter denne løkken. Dette kan for eksempel brukes til å søke etter en bestemt verdi i en matrise. For å gjøre dette, ved hjelp av en løkke, skannes hvert element i matrisen. Så snart det nødvendige elementet er funnet, er det ikke nødvendig å se gjennom resten - syklusen avbrytes.

Operatørapplikasjon Avslutt for vist i følgende eksempel. Her itererer loopen over 100 array-oppføringer og sammenligner hver med verdien av variabelen dVal… Hvis en match blir funnet, avsluttes løkken:

For i = 1 Til 100 Hvis dValues(i) = dVal Then IndexVal = i Exit For End If Next i

Do While-løkken i Visual Basic

Syklus Gjør mens utfører en kodeblokk så lenge den angitte betingelsen er oppfylt. Følgende er et eksempel på en prosedyre Sub, der bruker løkken Gjør mens Fibonacci-tall som ikke overstiger 1000 vises sekvensielt:

'Subprosedyre gir ut Fibonacci-tall som ikke overstiger 1000 Sub Fibonacci() Dim i As Integer 'teller for å indikere posisjonen til elementet i sekvensen Dim iFib As Integer 'lagrer gjeldende verdi av sekvensen Dim iFib_Next As Integer 'lagrer neste verdi av sekvensen Dim iStep As Integer 'lagrer størrelsen på neste trinn 'initialiser variablene i og iFib_Next i = 1 iFib_Next = 0 'Do While-løkken vil utføres til verdien av 'gjeldende Fibonacci-tall er større enn 1000 Gjør mens iFib_Next < 1000 If i = 1 Deretter 'spesielt tilfelle for første element iStep = 1 iFib = 0 Ellers 'lagre størrelsen på neste trinn før du overskriver' gjeldende verdi av sekvensen iStep = iFib iFib = iFib_Next End If 'skriv ut gjeldende Fibonacci-nummer i kolonne A av det aktive regnearket 'i raden med indeks i Cells(i , 1). Verdi = iFib 'beregn neste Fibonacci-tall og øk elementposisjonsindeksen med 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

I det gitte eksempelet, betingelsen iFib_Next < 1000 sjekket i begynnelsen av sløyfen. Derfor, hvis den første verdien iFib_Next Hvis det var mer enn 1000, ville løkken aldri bli utført.

En annen måte å implementere en loop Gjør mens - plasser betingelsen ikke i begynnelsen, men på slutten av løkken. I dette tilfellet vil sløyfen bli utført minst én gang, uavhengig av om betingelsen er oppfylt.

Skjematisk, en slik syklus Gjør mens med tilstanden som skal sjekkes på slutten vil se slik ut:

Gjør ... Loop mens iFib_Next < 1000

Bilde «Gjør til» i Visual Basic

Syklus Gjør til veldig lik syklus Gjør mens: kodeblokken i løkkens kropp utføres om og om igjen til den spesifiserte betingelsen er oppfylt (resultatet av det betingede uttrykket er ekte). I neste prosedyre Sub ved hjelp av en syklus Gjør til hente verdier fra alle cellene i en kolonne A regneark til kolonnen møter en tom celle:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Verdien til gjeldende celle er lagret i matrisen dCellValues ​​dCellValues(iRow) = Cells(iRow, 1). Verdi iRow = iRow + 1 Loop

I eksemplet ovenfor, betingelsen IsEmpty(Cells(iRow, 1)) plassert i begynnelsen av strukturen Gjør til, så løkken vil bli utført minst én gang hvis den første cellen som tas ikke er tom.

Imidlertid, som vist i løkkeeksemplene Gjør mens, i noen situasjoner er det nødvendig at løkken kjøres minst én gang, uavhengig av det første resultatet av det betingede uttrykket. I dette tilfellet bør det betingede uttrykket plasseres på slutten av løkken, slik:

Gjør ... Loop Til IsEmpty(Cells(iRow, 1))

Legg igjen en kommentar