Цикли във VBA

Има ситуации, когато се изисква VBA програма да извърши един и същ набор от действия няколко пъти подред (т.е. да повтори един и същ блок код няколко пъти). Това може да стане с помощта на VBA цикли.

VBA циклите включват:

След това ще разгледаме по-подробно всеки от тези цикли.

Оператор за цикъл във Visual Basic

Структурата на оператора за цикъл - във 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… Ако се намери съвпадение, цикълът се прекратява:

За i = 1 до 100 If dValues(i) = dVal Then IndexVal = i Изход за End If Next i

Цикълът Do While в Visual Basic

Цикъл Правете докато изпълнява блок от код, докато определеното условие е изпълнено. Следното е пример за процедура Под, в който с помощта на цикъла Правете докато Числата на Фибоначи, които не надвишават 1000, се показват последователно:

'Подпроцедура извежда числа на Фибоначи, които не надвишават 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 Ако i = 1 След това 'специален случай за първия елемент iStep = 1 iFib = 0 Else 'запазете размера на следващото увеличение, преди да презапишете 'текущата стойност на последователността 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_Next Ако имаше повече от 1000, тогава цикълът никога нямаше да бъде изпълнен.

Друг начин за прилагане на цикъл Правете докато - поставете условието не в началото, а в края на цикъла. В този случай цикълът ще се изпълни поне веднъж, независимо дали условието е изпълнено.

Схематично такъв цикъл Правете докато с условието, което трябва да се провери в края, ще изглежда така:

Направете ... Цикъл докато iFib_Next < 1000

Цикл «Do Until» във Visual Basic

Цикъл Направете До много подобен на цикъла Правете докато: блокът от код в тялото на цикъла се изпълнява отново и отново, докато не бъде изпълнено определеното условие (резултатът от условния израз е Вярно). В следващата процедура Под с помощта на цикъл Направете До извличане на стойности от всички клетки в колона A работен лист, докато колоната срещне празна клетка:

iRow = 1 Do Until IsEmpty(Cells(iRow, 1)) 'Стойността на текущата клетка се съхранява в масива dCellValues ​​​​dCellValues(iRow) = Cells(iRow, 1).Value iRow = iRow + 1 Loop

В горния пример условието IsEmpty(Cells(iRow, 1)) разположен в началото на конструкцията Направете До, така че цикълът ще бъде изпълнен поне веднъж, ако първата взета клетка не е празна.

Въпреки това, както е показано в примерите за цикъл Правете докато, в някои ситуации е необходимо цикълът да се изпълни поне веднъж, независимо от първоначалния резултат на условния израз. В този случай условният израз трябва да бъде поставен в края на цикъла, както следва:

Направете ... Цикл докато е празен (клетки (iRow, 1))

Оставете коментар