Silmused VBA-s

On olukordi, kus VBA-programm peab tegema samu toiminguid mitu korda järjest (st kordama sama koodiplokki mitu korda). Seda saab teha VBA silmuste abil.

VBA silmuste hulka kuuluvad:

Järgmisena vaatleme kõiki neid tsükleid lähemalt.

Silmusoperaatori jaoks Visual Basicus

Silmusoperaatori struktuur . Visual Basicus saab korraldada kahel kujul: tsüklina Sest… Järgmine või silmusena Igaühele.

Tsükkel "Järgmiseks …"

Tsükkel Sest… Järgmine kasutab muutujat, mis võtab järjestikku väärtusi antud vahemikust. Iga muutuja väärtuse muutusega sooritatakse tsükli kehasse suletud toimingud. Seda on lihtne mõista lihtsa näite põhjal:

Kui i = 1 kuni 10 Kokku = kokku + iArray(i) Järgmine i

Selles lihtsas ahelas Sest… Järgmine kasutatakse muutujat i, mis võtab järjestikku väärtused 1, 2, 3, … 10 ja iga nende väärtuste jaoks käivitatakse tsükli sees olev VBA kood. Seega summeerib see tsükkel massiivi elemendid. iArray muutuvas Summa.

Ülaltoodud näites ei ole tsükli juurdekasvu määratud, seega muutuja suurendamiseks i 1 kuni 10, on vaikimisi kasv 1… Siiski on mõnel juhul vaja tsükli jaoks kasutada erinevaid juurdekasvu väärtusi. Seda saab teha märksõna abil Sammnagu on näidatud järgmises lihtsas näites.

d = 0 kuni 10 Samm 0.1 dKokku = dKokku + d Järgmine d

Kuna ülaltoodud näites on juurdekasvu samm võrdne väärtusega 0.1, siis muutuja dKokku iga tsükli korduse jaoks on väärtused 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

VBA-s tsükli sammu määramiseks võite kasutada negatiivset väärtust, näiteks järgmiselt:

Kui i = 10 kuni 1 Samm -1 iArray(i) = i Järgmine i

Siin on juurdekasv -1, seega muutuja i iga tsükli kordusega omandab väärtused 10, 9, 8, … 1.

Silmus "Iga jaoks"

Tsükkel Igaühele sarnane tsükliga Sest… Järgmine, kuid selle asemel, et itereerida loenduri muutuja väärtuste jada, on silmus Igaühele sooritab tegevuste komplekti iga objekti jaoks määratud objektide rühmas. Järgmises näites silmuse abil Igaühele loetleb kõik praeguse Exceli töövihiku lehed:

Hämardage wSheet töölehena iga wlehe jaoks töölehtedes MsgBox "Найден лист: " & wSheet.Name Next wSheet

Silmuse katkestuse lause "Exit For"

operaator Välju kasutatakse tsükli katkestamiseks. Niipea, kui seda lauset koodis kohtab, lõpetab programm tsükli täitmise ja jätkab kohe pärast seda tsüklit koodis olevate lausete täitmist. Seda saab kasutada näiteks massiivist kindla väärtuse otsimiseks. Selleks skannitakse tsükli abil iga massiivi elementi. Niipea kui vajalik element on leitud, pole vaja ülejäänut läbi vaadata – tsükkel katkeb.

Operaatorrakendus Välju on näidatud järgmises näites. Siin kordab tsükkel üle 100 massiivikirje ja võrdleb neid muutuja väärtusega dVal… Kui vaste leitakse, siis tsükkel lõpetatakse:

Kui i = 1 kuni 100 Kui dValues(i) = dVal, siis IndexVal = i Välju lõppu Kui järgmine i

Do While Silmus Visual Basicus

Tsükkel Tee aega käivitab koodiploki seni, kuni määratud tingimus on täidetud. Järgmine on protseduuri näide alla, milles kasutades silmust Tee aega Fibonacci numbrid, mis ei ületa 1000, kuvatakse järjestikku:

Alamprotseduur väljastab Fibonacci numbreid, mis ei ületa 1000 Sub Fibonacci() Dim i As Integer 'loendur, mis näitab elemendi asukohta jadas Dim iFib As Integer 'salvestab jada praeguse väärtuse Dim iFib_Next As Integer 'salvestab järgmise väärtuse jadast Dim iStep As Integer 'salvestab järgmise juurdekasvu suuruse 'initsialiseeri muutujad i ja iFib_Next i = 1 iFib_Next = 0 'Do While tsükkel käivitatakse seni, kuni 'praeguse Fibonacci arvu väärtus on suurem kui 1000 = Doex1000 iFiib1_1 Kuigi <iFiib0_1 1 Seejärel 'esimese elemendi erijuhtum iStep = 1 iFib = XNUMX Muul juhul salvestage järgmise juurdekasvu suurus enne jada praeguse väärtuse ülekirjutamist iStep = iFib iFib = iFib_Next End If 'printige praegune Fibonacci number veergu A aktiivne tööleht 'reas indeksiga i Cells(i , XNUMX).Value = iFib 'arvutage järgmine Fibonacci arv ja suurendage elemendi asukohaindeksit XNUMX võrra iFib_Next = iFib + iStep i = i + XNUMX Loop End Sub

Antud näites tingimus iFib_Next < 1000 kontrollitakse tsükli alguses. Seega, kui esimene väärtus iFib_Next Kui neid oleks rohkem kui 1000, siis tsüklit ei teostataks kunagi.

Teine võimalus silmuse rakendamiseks Tee aega - asetage tingimus mitte tsükli algusesse, vaid lõppu. Sel juhul käivitatakse tsükkel vähemalt üks kord, olenemata sellest, kas tingimus on täidetud.

Skemaatiliselt selline tsükkel Tee aega lõpus kontrollitav tingimus näeb välja selline:

Tehke ... Loop Kuigi iFib_Next < 1000

Valige Visual Basicus "Do Kuni".

Tsükkel Tee Kuni väga sarnane tsikliga Tee aega: tsükli kehas olevat koodiplokki täidetakse ikka ja jälle, kuni määratud tingimus on täidetud (tingimusavaldise tulemus on Tõsi). Järgmises protseduuris alla kasutades tsüklit Tee Kuni hankida väärtusi veeru kõigist lahtritest A töölehel, kuni veerg kohtab tühja lahtrit:

iRow = 1 Do Til IsEmpty(Cells(iRow, 1)) 'Praeguse lahtri väärtus salvestatakse massiivi dCellValues>dCellValues(iRow) = Cells(iRow, 1).Väärtus iRow = iRow + 1 Loop

Ülaltoodud näites on tingimus IsEmpty (lahtrid (iRow, 1)) asub konstruktsiooni alguses Tee Kuni, seega käivitatakse silmus vähemalt üks kord, kui esimene võetud lahter pole tühi.

Kuid nagu on näidatud tsükli näidetes Tee aega, mõnes olukorras on vajalik, et tsüklit käivitataks vähemalt üks kord, sõltumata tingimusavaldise algtulemusest. Sel juhul tuleks tingimusavaldis asetada tsükli lõppu järgmiselt:

Tehke ... Loop kuni IsEmpty (lahtrid (iRow, 1))

Jäta vastus