Самовчитель по excel vba цикли в vba

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

До циклам VBA відносяться:

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

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

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

Цикл «For ... Next»

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

У цьому простому циклі For. Next використовується змінна i. яка послідовно приймає значення 1, 2, 3, ... 10, і для кожного з цих значень виконується код VBA, що знаходиться всередині циклу. Таким чином, даний цикл підсумовує елементи масиву iArray в змінної Total.

У наведеному вище прикладі крок збільшення циклу не вказано, тому для покрокового збільшення змінної i від 1 до 10 за замовчуванням використовується приріст 1. Однак, в деяких випадках потрібно використовувати інші значення збільшення для циклу. Це можна зробити за допомогою ключового слова Step. як показано в наступному простому прикладі.

Так як в наведеному вище прикладі заданий крок збільшення рівний 0.1. то змінна dTotal для кожного повторення циклу приймає значення 0.0, 0.1, 0.2, 0.3, ... 9.9, 10.0.

Для визначення кроку циклу в VBA можна використовувати негативну величину, наприклад, ось так:

Тут крок збільшення дорівнює -1. тому змінна i з кожним повторенням циклу приймає значення 10, 9, 8, ... 1.

Цикл «For Each»

Цикл For Each схожий на цикл For. Next. але замість того, щоб перебирати послідовність значень для змінної-лічильника, цикл For Each виконує набір дій для кожного об'єкта із зазначеної групи об'єктів. У наступному прикладі за допомогою циклу For Each виконується перерахування всіх листів в поточній робочій книзі Excel:

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

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

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

Цикл «Do While» в Visual Basic

Цикл Do While виконує блок коду до тих пір, поки виконується задана умова. Далі наведено приклад процедури Sub. в якій за допомогою циклу Do While виводяться послідовно числа Фібоначчі що не перевищують 1000:

У наведеному прикладі умова iFib_Next <1000 проверяется в начале цикла. Поэтому если бы первое значение iFib_Next было бы больше 1000, то цикл бы не выполнялся ни разу.

Інший спосіб реалізувати цикл Do While - помістити умова не на початку, а в кінці циклу. У цьому випадку цикл буде виконано хоча б раз, не залежно від того, чи виконується умова.

Схематично такий цикл Do While з перевіряється умовою в кінці буде виглядати ось так:

Цикл «Do Until» в Visual Basic

Цикл Do Until дуже схожий на цикл Do While. блок коду в тілі циклу виконується раз по раз до тих пір, поки задана умова виконується (результат умовного виразу дорівнює True). У наступній процедурі Sub за допомогою циклу Do Until витягуються значення з усіх комірок стовпчика A робочого листа до тих пір, поки в стовпці не зустрінеться порожня клітинка:

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

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