Цикли у VBA

Бувають ситуації, коли програмі VBA потрібно виконати один і той самий набір дій кілька разів поспіль (тобто кілька разів повторити один і той же блок коду). Це можна зробити за допомогою циклів VBA.

Цикли VBA включають:

Далі ми докладніше розглянемо кожен із цих циклів.

Оператор циклу For у Visual Basic

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

Цикл «На … далі»

Цикл Для… Далі використовує змінну, яка послідовно приймає значення із заданого діапазону. При кожній зміні значення змінної виконуються дії, укладені в тілі циклу. Це легко зрозуміти на простому прикладі:

Для i = від 1 до 10 Total = Total + iArray(i) Next 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

Оператор переривання циклу «Exit For»

Оператор Вихід для використовується для переривання циклу. Як тільки цей оператор зустрічається в коді, програма припиняє виконання циклу і переходить до виконання операторів, які знаходяться в коді відразу після цього циклу. Це можна використовувати, наприклад, для пошуку певного значення в масиві. Для цього за допомогою циклу сканується кожен елемент масиву. Як тільки потрібний елемент знайдено, решту переглядати не потрібно – цикл переривається.

Додаток оператора Вихід для показано в наступному прикладі. Тут цикл повторює понад 100 записів масиву та порівнює кожен із значенням змінної dVal… Якщо збіг знайдено, цикл припиняється:

For i = 1 to 100 If dValues(i) = dVal Then IndexVal = i Exit For 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, то цикл ніколи б не виконувався.

Ще один спосіб реалізації циклу Допоки - поставити умову не на початку, а в кінці циклу. У цьому випадку цикл буде виконано хоча б один раз, незалежно від того, чи виконується умова.

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

Do ... Loop While 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 цикл

У наведеному вище прикладі умова IsEmpty(Cells(iRow, 1)) розташований на початку конструкції До, тому цикл буде виконано принаймні один раз, якщо перша взята клітинка не порожня.

Однак, як показано в прикладах циклів Допоки, у деяких ситуаціях необхідно, щоб цикл був виконаний принаймні один раз, незалежно від початкового результату умовного виразу. У цьому випадку умовний вираз слід розмістити в кінці циклу, ось так:

Виконати ... Цикл до IsEmpty(Cells(iRow, 1))

залишити коментар