Цыклы ў VBA

Бываюць сітуацыі, калі праграме VBA патрабуецца выканаць адзін і той жа набор дзеянняў некалькі разоў запар (гэта значыць паўтарыць адзін і той жа блок кода некалькі разоў). Гэта можна зрабіць з дапамогай цыклаў VBA.

Цыклы VBA ўключаюць:

Далей мы больш падрабязна разгледзім кожны з гэтых цыклаў.

Аператар цыклу For у Visual Basic

Структура аператара цыкла ,en у Visual Basic можа быць арганізаваны ў адной з дзвюх формаў: як цыкл Для… Далей або ў выглядзе пятлі Для кожнага.

Цыкл «За… Далей»

Цыкл Для… Далей выкарыстоўвае зменную, якая паслядоўна прымае значэнні з зададзенага дыяпазону. Пры кожным змене значэння зменнай выконваюцца дзеянні, зняволеныя ў целе цыкла. Гэта лёгка зразумець з простага прыкладу:

Для i = 1 да 10 Total = Total + iArray(i) Далей i

У гэтым простым цыкле Для… Далей выкарыстоўваецца зменная i, які паслядоўна прымае значэнні 1, 2, 3, … 10, і для кожнага з гэтых значэнняў выконваецца код VBA ўнутры цыкла. Такім чынам, гэты цыкл сумуе элементы масіва. iArray у зменнай Цэна.

У прыведзеным вышэй прыкладзе прырашчэнне цыклу не вызначана, таму трэба павялічыць зменную i ад 1 да 10, па змаўчанні - прырашчэнне 1… Аднак у некаторых выпадках для цыкла неабходна выкарыстоўваць розныя значэнні прырашчэння. Гэта можна зрабіць з дапамогай ключавога слова Крокяк паказана ў наступным простым прыкладзе.

Для d = 0 да 10 Крок 0.1 dTotal = dTotal + d Далей d

Паколькі ў прыведзеным вышэй прыкладзе крок прырашчэння задаецца роўным 0.1, то зменная dУсяго для кожнага паўтарэння цыкла прымае значэнні 0.0, 0.1, 0.2, 0.3,… 9.9, 10.0.

Каб вызначыць крок цыкла ў VBA, вы можаце выкарыстоўваць адмоўнае значэнне, напрыклад, так:

Для i = 10 Да 1 Крок -1 iArray(i) = i Далей i

Вось прыбаўка -1, таму зменная i пры кожным паўтарэнні цыкла набывае значэння 10, 9, 8, … 1.

Пятля «Для кожнага»

Цыкл Для кожнага падобны на цыкл Для… Далей, але замест таго, каб перабіраць паслядоўнасць значэнняў для зменнай лічыльніка, цыкл Для кожнага выконвае набор дзеянняў для кожнага аб'екта ў названай групе аб'ектаў. У наступным прыкладзе з выкарыстаннем цыкла Для кожнага пералічвае ўсе аркушы ў бягучай кнізе Excel:

Зацямніць wSheet як працоўны ліст для кожнага wSheet у працоўных лістах MsgBox "Найдэн ліст: " & wSheet.Name Next wSheet

Аператар перапынення цыкла "Выхад для"

аператар Выхад для выкарыстоўваецца для перапынення цыкла. Як толькі гэты аператар сустракаецца ў кодзе, праграма завяршае выкананне цыклу і пераходзіць да выканання аператараў, якія знаходзяцца ў кодзе адразу пасля гэтага цыклу. Гэта можна выкарыстоўваць, напрыклад, для пошуку пэўнага значэння ў масіве. Для гэтага з дапамогай цыкла скануецца кожны элемент масіва. Як толькі неабходны элемент знойдзены, астатнія праглядаць не трэба - цыкл перарываецца.

Прыкладанне аператара Выхад для паказана ў наступным прыкладзе. Тут цыкл перабірае больш за 100 запісаў масіва і параўноўвае кожны са значэннем зменнай dVal... Калі супадзенне знойдзена, то цыкл спыняецца:

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

Цыкл Do While у Visual Basic

Цыкл Пачакайце выконвае блок кода, пакуль выконваецца ўказаная ўмова. Ніжэй прыведзены прыклад працэдуры Sub, у якім з дапамогай завесы Пачакайце Лікі Фібаначы, якія не перавышаюць 1000, адлюстроўваюцца паслядоўна:

'Sub працэдура выводзіць лікі Фібаначы, якія не перавышаюць 1000 Sub Fibonacci() Dim i As Integer 'лічыльнік для ўказання пазіцыі элемента ў паслядоўнасці Dim iFib As Integer 'захоўвае бягучае значэнне паслядоўнасці Dim iFib_Next As Integer 'захоўвае наступнае значэнне паслядоўнасці Dim iStep As Integer 'захоўвае памер наступнага прырашчэння 'ініцыялізаваць зменныя i і iFib_Next i = 1 iFib_Next = 0 'Цыкл Do While будзе выконвацца, пакуль значэнне 'бягучага ліку Фібаначы не стане большым за 1000 Do While iFib_Next < 1000 If i = 1 Затым 'асаблівы выпадак для першага элемента iStep = 1 iFib = 0 Інакш 'захавайце памер наступнага прырашчэння перад перазапісам' бягучага значэння паслядоўнасці iStep = iFib iFib = iFib_Next End If 'надрукуйце бягучы лік Фібаначы ў слупку A з актыўны аркуш 'у радку з індэксам i Cells(i , 1).Value = iFib 'вылічыць наступны лік Фібаначы і павялічыць індэкс пазіцыі элемента на 1 iFib_Next = iFib + iStep i = i + 1 Loop End Sub

У прыведзеным прыкладзе ўмова iFib_Next < 1000 правяраецца ў пачатку цыкла. Такім чынам, калі першае значэнне iFib_Далей Калі б іх было больш за 1000, то цыкл ніколі не быў бы выкананы.

Яшчэ адзін спосаб рэалізацыі цыкла Пачакайце - ставіць умову не ў пачатку, а ў канцы цыкла. У гэтым выпадку цыкл будзе выкананы хаця б адзін раз, незалежна ад таго, ці выконваецца ўмова.

Схематычна такі цыкл Пачакайце з умовай, якую трэба праверыць у канцы, будзе выглядаць так:

Do ... Loop While iFib_Next < 1000

Цыкл «Do Until» у Visual Basic

Цыкл Рабіце пакуль вельмі падобны на цыкл Пачакайце: блок кода ў целе цыклу выконваецца зноў і зноў, пакуль не будзе выканана зададзеная ўмова (вынік умоўнага выразу: праўда). У наступнай працэдуры Sub выкарыстоўваючы цыкл Рабіце пакуль атрымаць значэнні з усіх вочак у слупку A ліст, пакуль слупок не сустрэне пустую ячэйку:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Значэнне бягучай ячэйкі захоўваецца ў масіве dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 цыкл

У прыведзеным вышэй прыкладзе ўмова IsEmpty(Cells(iRow, 1)) размешчаны ў пачатку канструкцыі Рабіце пакуль, таму цыкл будзе выкананы хаця б адзін раз, калі першая ўзятая ячэйка не пустая.

Аднак, як паказана ў прыкладах цыклаў Пачакайце, у некаторых сітуацыях неабходна, каб цыкл быў выкананы хаця б адзін раз, незалежна ад першапачатковага выніку ўмоўнага выразу. У гэтым выпадку ўмоўны выраз трэба размясціць у канцы цыклу, як гэта:

Выканайце ... цыкл, пакуль не стане пустым (ячэйкі (iRow, 1))

Пакінуць каментар