Slingor i VBA

Det finns situationer när ett VBA-program krävs för att utföra samma uppsättning åtgärder flera gånger i rad (det vill säga upprepa samma kodblock flera gånger). Detta kan göras med VBA-loopar.

VBA-slingor inkluderar:

Därefter ska vi titta närmare på var och en av dessa cykler.

För Loop Operator i Visual Basic

Slingoperatörens struktur Smakämnen i Visual Basic kan organiseras i en av två former: som en loop För nästa eller som en slinga För varje.

Cykla "För ... Nästa"

Cykel För nästa använder en variabel som sekventiellt tar värden från ett givet intervall. Med varje förändring av värdet på variabeln utförs de åtgärder som är inneslutna i cykelns kropp. Detta är lätt att förstå från ett enkelt exempel:

För i = 1 Till 10 Totalt = Totalt + iArray(i) Nästa i

I denna enkla slinga För nästa variabel används i, som sekventiellt tar värdena 1, 2, 3, … 10, och för vart och ett av dessa värden exekveras VBA-koden inuti slingan. Således summerar denna loop elementen i arrayen. iArray i variabel Totalt.

I exemplet ovan är loopinkrementet inte specificerat, så för att öka variabeln i från 1 till 10 är standardvärdet ett steg 1… Men i vissa fall är det nödvändigt att använda olika inkrementvärden för slingan. Detta kan göras med hjälp av nyckelordet Stegsom visas i följande enkla exempel.

För d = 0 Till 10 Steg 0.1 dTotal = dTotal + d Nästa d

Eftersom inkrementsteget i exemplet ovan sätts lika med 0.1, sedan variabeln dTotalt för varje upprepning av cykeln antar värdena 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

För att bestämma loopsteget i VBA kan du använda ett negativt värde, till exempel så här:

För i = 10 Till 1 Steg -1 iArray(i) = i Nästa i

Här är ökningen -1, alltså variabeln i med varje upprepning av cykeln antar värdena 10, 9, 8, … 1.

Slinga "för varje"

Cykel För varje liknar en cykel För nästa, men istället för att iterera över värdesekvensen för räknarvariabeln, loopen För varje utför en uppsättning åtgärder för varje objekt i den angivna gruppen av objekt. I följande exempel använder du en loop För varje räknar upp alla ark i den aktuella Excel-arbetsboken:

Dim wSheet som arbetsblad för varje wSheet i arbetsblad MsgBox "Найден лист: " & wSheet.Name Nästa wSheet

Slingavbrottssats "Avsluta för"

Operatör Avsluta för används för att avbryta cykeln. Så snart denna sats påträffas i koden, avslutar programmet exekveringen av slingan och fortsätter till exekveringen av de satser som finns i koden omedelbart efter denna slinga. Detta kan till exempel användas för att söka efter ett specifikt värde i en array. För att göra detta, med hjälp av en slinga, skannas varje element i arrayen. Så snart det nödvändiga elementet hittats behöver du inte titta igenom resten - cykeln avbryts.

Operatörsapplikation Avsluta för visas i följande exempel. Här itererar slingan över 100 arrayposter och jämför var och en med värdet på variabeln dVal… Om en matchning hittas, avslutas slingan:

För i = 1 Till 100 Om dValues(i) = dVal Then IndexVal = i Exit For End If Next i

Do While-slingan i Visual Basic

Cykel Göra medan exekverar ett kodblock så länge det angivna villkoret är uppfyllt. Följande är ett exempel på en procedur Sub, där man använder slingan Göra medan Fibonacci-tal som inte överstiger 1000 visas sekventiellt:

'Subprocedur matar ut Fibonacci-tal som inte överstiger 1000 Sub Fibonacci() Dim i As Integer 'räknare för att indikera positionen för elementet i sekvensen Dim iFib As Integer 'lagrar det aktuella värdet för sekvensen Dim iFib_Next As Integer 'lagrar nästa värde av sekvensen Dim iStep As Integer 'lagrar storleken på nästa steg 'initiera variablerna i och iFib_Next i = 1 iFib_Next = 0 'Do While-slingan kommer att köras tills värdet på 'aktuella Fibonacci-tal är större än 1000 Gör medan iFib_Next < 1000 If i = 1 Sedan 'specialfall för första elementet iStep = 1 iFib = 0 Annars 'spara storleken på nästa steg innan du skriver över 'det aktuella värdet för sekvensen iStep = iFib iFib = iFib_Next End If 'skriv ut det aktuella Fibonacci-numret i kolumn A av det aktiva kalkylbladet 'i raden med index i Cells(i , 1).Value = iFib 'beräkna nästa Fibonacci-tal och öka elementets positionsindex med 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

I det givna exemplet är villkoret iFib_Next < 1000 kontrolleras i början av slingan. Därför, om det första värdet iFib_Nästa Om det fanns fler än 1000, skulle slingan aldrig exekveras.

Ett annat sätt att implementera en loop Göra medan - placera villkoret inte i början, utan i slutet av slingan. I detta fall kommer loopen att exekveras minst en gång, oavsett om villkoret är uppfyllt.

Schematiskt en sådan cykel Göra medan med villkoret som ska kontrolleras i slutet kommer att se ut så här:

Gör ... Loop medan iFib_Next < 1000

Bild «Gör tills» i Visual Basic

Cykel Gör tills mycket lik cykel Göra medan: kodblocket i slingans kropp exekveras om och om igen tills det angivna villkoret är uppfyllt (resultatet av det villkorliga uttrycket är Sant). I nästa procedur Sub med hjälp av en cykel Gör tills hämta värden från alla celler i en kolumn A kalkylblad tills kolumnen stöter på en tom cell:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Värdet för den aktuella cellen lagras i arrayen dCellValues ​​dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

I exemplet ovan, villkoret IsEmpty(Cells(iRow, 1)) ligger i början av strukturen Gör tills, så loopen kommer att exekveras minst en gång om den första cellen som tas inte är tom.

Men som visas i loop-exemplen Göra medan, i vissa situationer är det nödvändigt att loopen exekveras minst en gång, oavsett det initiala resultatet av det villkorliga uttrycket. I det här fallet bör det villkorliga uttrycket placeras i slutet av slingan, så här:

Gör ... Loop Till IsEmpty(Cells(iRow, 1))

Kommentera uppropet