VBA Оператори циклу. Вкладені цикли. Цикли VBA Цикл з непостійним приростом у vba

Крім структур прийняття рішень, існують ще один різновид керуючих конструкцій, що називається циклом.

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

У мові Visual BasicІснує три основних види циклів, які реалізується за допомогою конструкцій For:Next, Do:Loop та While:Wend.

Цикл For:Next. Використовується у тому випадку, коли кількість повторів заданого блоку операторів відома заздалегідь. Дана конструкція виглядає так:

For лічильник = початкове значення To кінцеве значення Оператори1 Оператори2 Next [лічильник]

Коли наведені оператори виконуються вперше, то змінній лічильнику надається початкове значення, після чого можливі два варіанти дій. Якщо в результаті перевірки умови лічильник > кінцеве значення було отримано значення True, відбувається завершення циклу, при цьому блоки оператори1 і оператори2 жодного разу не виконуються. З іншого боку, якщо результатом перевірки умови є False, то в цьому випадку блоки операторів виконуються перший раз, після чого відбувається перехід на початок циклу. Далі значення змінної-лічильника збільшується на крок, розташований після ключового слова Step (у разі відсутності встановлюється крок = 1). Після цього знову перевіряється істинність умови лічильник > кінцеве значення тощо, закінчення циклу відбувається в той момент, коли результатом цієї перевірки стане значення True.

Найчастіше буває необхідно "аварійно" завершувати роботу циклу при виконанні будь-якої додаткової умови. У цьому випадку всередині циклу слід використовувати службове словосполучення Exit: For, яке зазвичай розташовують у керуючій конструкції, наприклад:

If умова Then Exit For

Якщо результатом перевірки умови буде значення True, виконання циклу буде припинено, причому блок оператори1 буде виконаний черговий раз, а блок операори2 - немає.

Цикл Do:Loop. Застосовується у тому випадку, коли кількість повторень операторів тіла циклу наперед невідома. Існують чотири різновиди даної конструкції. При використанні перших двох циклів або виконається багато разів, або не виконається взагалі.

Do Until умова Оператори Loop

Якщо результатом перевірки умови є значення False, блок оператори виконується, інакше здійснюється перехід на оператор, розташований після службового слова Loop. З іншого боку, якщо перша перевірка умови дасть результат True, цикл не виконається жодного разу.

Do While умова Оператори Loop

Якщо умова істинна, відбувається виконання блоку оператори, якщо ж хибно, тобто результатом перевірки є False, то цикл не виконатися жодного разу.

У разі використання двох останніх конструкцій цикл буде виконаний хоча б один раз.

Do Оператори Loop Until умова

Блок оператори виконується до тих пір, поки результатом перевірки умови є значення False, інакше виконання циклу закінчується.

Do Оператори Loop While умова

Що стосується помилковості умови виконується блок оператори, якщо воно істинно, тобто. результатом перевірки є значення True, відбувається закінчення чикла.

Цикл While: Wend. Також використовується в тому випадку, коли число повторень операторів тіла циклу заздалегідь невідоме і має наступний синтаксис:

While умова Оператори Wend

Якщо результатом перевірки умови є значення True, блок оператори виконується, інакше здійснюється перехід на оператор, розташований після службового слова Wend. З іншого боку, якщо перша перевірка умови дасть результат False, цикл не виконається жодного разу.

Лабораторні роботи з основ програмування

2.1. Табулювання функцій, представлених аналітично
і схожим поруч

Мета роботи

· Закріплення теоретичних знань з основ організації розгалужуваних і циклічних структур.

· Придбання практичних навичок програмування з використанням розгалужуваних та циклічних структур у системі Visual Basic.

У VB існують три види операторів циклу:

· Рахунковий цикл: For ... To ... Next

· цикли з передумовами: Do While ... Loop, Do Until ... Loop, While ... WEnd

· цикли з постумовами: Do ... Loop While, Do ... Loop Until.

Рахунковий цикл – дозволяє циклічно виконувати набір операторів задану кількість разів. Його синтаксис наступний:

For лічильник = початок To кінець

[оператори]

[оператори]

Next [ лічильник]

Параметр лічильник– це числова змінна (цілого, речового типу або типу Date, Variant, Currency), яка автоматично збільшується після кожного повтору. Початкове значення лічильникадорівнює параметру початок,а кінцевий параметр – кінець.Якщо не вказано, крок вважається рівним 1, значення кроку можна змінювати. Воно може бути позитивним чи негативним числом.

Існують чотири синтаксичні конструкції циклу Do….

Оператори між ключовими словами Do … Loop виконуються задану кількість разів залежно від умови. Наприклад, у наступному фрагменті програми при C = 100 умова виконуватиметься і відбудеться вхід у цикл. Усередині циклу відбувається звернення до процедури та зменшення значення C на 1. Далі знову перевіряється умова (C > 0) і оператори циклу виконуються повторно (всього вони виконаються 100 разів), до C = 0. Коли ж умова C >0 стає хибною та цикл припиняється.

Do While C > 0

Той самий фрагмент програми, виконаний з використанням циклу з передумовою синтаксису 2:

В даному випадкуцикл виконується, поки умова дорівнює False, на відміну попереднього випадку, тобто продовжується довиконання умови C=0.

Оператори циклів синтаксису 3 і 4 дуже схожі на перші два за винятком того, що умова необчислюється до того часу, поки цикл не виконається хоча б один раз.

У синтаксисах цих циклів можна використовувати оператори безумовного виходу з циклу Exit For та Exit Do, що дозволяють передати керування оператору, який перебуває за циклом. Наприклад, у наступному фрагменті програми, якщо початкове значення C виявиться >50, цикл негайно припинитися.



Do Until C<= 0

MsgBox “Поч. значення більше допустимого”, ”Помилка введення”

Цикл While…Wend використовувався у ранніх версіях Visual Basic. Його синтаксис наступний:

While<условие>

<Операторы>

На відміну від циклу Do..Loop цикл While ..Wend немає другого варіанту, у якому перевірка умови виконується наприкінці циклу. Крім того, для нього немає оператора виходу з циклу, на зразок Exit Do.

Цикли дозволяють виконати один або кілька рядків коду кілька разів. VBA підтримує такі цикли:

For...Next For Each...Next Do... Loop

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

For counter = start To end оператори Next

Параметри counter (лічильник), start (початок циклу), end (кінець циклу) та increment (прирощення) є числовими.

Примітка. Параметр increment може бути як позитивним, і негативним. Якщо він позитивний, параметр start повинен бути меншим або дорівнює параметру end, інакше цикл не виконуватиметься. Якщо параметр increment негативний, то параметр start має бути більшим або дорівнює значенню параметра end, щоб виконувалось тіло циклу. Якщо параметр Step не заданий, значення параметра increment за замовчуванням дорівнює 1.

VBA виконує цикл For у наступній послідовності:

1. Встановлює значення змінної циклу counter у значення start.

2. Порівнює значення змінної циклу counter та значення параметра end. Якщо змінна counter більша, VBA завершує виконання циклу. (Якщо значення параметра increment негативно, то VBA припиняє виконання циклу за умови, що значення змінної циклу counter менше значення параметра end.)

3. Виконує оператори тіла циклу statements.

4. Збільшує значення змінної циклу counter на 1 або величину значення параметра increment, якщо він заданий.

5. Повторює кроки з 2 до 4.

Розглянемо приклад: Обчислити значення функції f(t)

при заданих a, b, n, якщо t змінюється від a до b з кроком Dt=(b-a)/(n-1).

Sub приклад3() Dim f() As Single Dim As Single, b As Single, t As Single, dt As Single Dim i As Integer, n As Integer Call read("a1", a) : Call read("b1" , b) : Call read("c1", n) ReDim f(1 To n - 1) dt = (b - a) / (n - 1) : t = a Call out("a2", "i") : Call out("b2", "t") : Call out("c2", "f(t)") For i = 1 To n - 1 t = t + dt If t<= -1 Then f(i) = -1 ElseIf t >1 Then f(i) = 1 Else f(i) = t End If Call out("a" & (2 + i), i) : Call out("b" & (2 + i), t) : Call out("c" & (2 + i), f(i)) Next i End Sub

Конструкція For Each. . . Next

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

Синтаксис конструкції циклу For Each. . . Next такий:

For Each element In group оператори Next element

Слід пам'ятати такі обмеження при використанні циклу For Each. . . Next:

Для наборів параметр element може бути лише змінною типу variant, загальною змінною типу object або об'єктом, перерахованим у Object Browser

Для масивів параметр element може бути лише змінною типу Variant

Не можна використовувати цикл For Each. . . Next з масивом, що має певний користувач тип, так як змінна типу variant не може містити значення певного користувачем типу

Конструкція Do...Loop

Цикл Do застосовується для виконання блоку операторів необмежену кількість разів. Існує кілька різновидів конструкції Do. . . Loop, але кожна їх обчислює вираз-умова, щоб визначити момент виходу з циклу. Як і у випадку конструкції If. . . Ця умова повинна бути величиною або виразом, що приймають значення False (нуль) або True (не нуль).

У наступній конструкції Do. . . Loop оператори виконуються доти, доки значенням умови є True (Істина):

Do While умова оператори Loop

Виконуючи цей цикл, VBA спочатку перевіряє умову. Якщо умова помилкова (False), він пропускає всі оператори циклу. Якщо воно є істинним (True), VBA виконує оператори циклу, знову повертається до оператора Do While і знову перевіряє умову.

Отже, цикл, представлений даною конструкцією, може виконуватись будь-яке число разів, поки значенням умови є не нуль або True (Істина). Зазначимо, що оператори тіла циклу не виконуються жодного разу, якщо за першої перевірки умови воно виявляється помилковим (False).

Розглянемо приклад: Обчислити суму ряду

із заданою точністю.

Sub приклад4() Dim e As Single, x As Single, s As Single Dim m As Single, p As Single, i As Single Call read("a1", x) : Call read("b1", e) s = 0 : i = 1: m = 1: p = -1 Call out("a2", "i") : Call out("b2", "m") : Call out("c2", "s") Do While Abs(m) >= ep = -p * xm = p / is = s + m Call out("a"&(2+i), i): Call out("b"&(2+i), Abs (m)) : Call out("c" & (2 + i), s) i = i + 1 Loop End Sub

Інший різновид конструкції Do. . . Loop спочатку виконує оператори тіла циклу, а потім перевіряє умову після кожного виконання. Цей різновид гарантує, що оператори тіла циклу виконуються принаймні один раз:

Do оператори Loop While умова

Два інші різновиди конструкції циклу аналогічні попереднім, за винятком того, що цикл виконується, поки умова помилкова (False):

Цикл не виконується взагалі або виконується багато разів:

Do Until умова

оператори Loop

Цикл виконується принаймні один раз:

оператори

Loop Until умова

7.2 Вкладені цикли.

Можна поміщати структури управління всередину інших структур управління (наприклад, блок If . . . Then всередину циклу For . . . Next). Говорять, що структура управління, вміщена всередину іншої структури управління, є вкладеною.

Глибина вкладення керуючих структур VBA не обмежена. Для поліпшення читаності коду прийнято практику зміщення тіла конструкції прийняття рішення або циклу в програмі у разі використання вкладених структур управління.

При вкладенні в цикл одного або кілька інших циклів говорять про вкладені цикли, в яких розрізняють зовнішні (що охоплюють) і внутрішні (вкладені) цикли.

Розглянемо приклад підсумовування елементів Aij матриці A(n,m) рядково.

Sub приклад5() Dim a() As Single, s() As Single Dim n As Integer, m As Integer Dim i As Integer, j As Integer Call read("a1", n): Call read("b1", m ) ReDim a(1 To n, 1 To m), s(1 To n) "Читання матриці For i = 1 To n For j = 1 To m Call readcell(i + 1, j, a(i, j)) Next j Next i "Обчислення For i = 1 To ns(i) = 0 For j = 1 To ms(i) = s(i) + a(i, j) Next j Call outcell(i + 1, m + 1 , s(i)) Next i End Sub

Зауважимо, перший оператор Next закриває внутрішній цикл For, а останній оператор Next закриває зовнішній цикл For. Так само і для вкладених операторів If, оператори End If автоматично застосовуються для закриття найближчого до нього оператора If. Вкладені структури Do. . . Loop працюють так само: найдальший оператор Loop відповідає найдальшому оператору Do.

Під час введення/виведення елементів двовимірного масивуна робочий лист Microsoft Excelзручно застосовувати користувацькі процедури введення/виводу:

Sub readcell(i As Integer, j As Integer, val As Variant) val = Лист1.Cells(i, j).Value End Sub j).Value = val End Sub

де I – номер рядка, j – номер стовпця робочого листа.

Вихід із структур управління

Оператор Exit дозволяє виходити безпосередньо з циклу For, циклу Do, процедур Sub або процедур Function. Синтаксис оператора Exit простий:

For counter = start To end [блок операторів] [блок операторів] Next Do [(While | Until) умова] [блок операторів] [блок операторів] Loop

Exit For всередині циклу For і Exit Do всередині циклу Do можуть з'явитися скільки завгодно разів.

Оператор Exit Do працює з усіма різновидами синтаксису циклу Do.

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

При використанні оператора Exit для виходу з циклу значення змінної циклу залежать від того, як завершується виконання циклу:

При нормальному завершенні циклу значення змінної циклу має на одиницю більше за верхню межу числа циклів

При передчасному завершенні циклу змінна циклу зберігає своє значення, яке вона набула з урахуванням звичайних правил

При завершенні циклу до кінця набору змінна циклу має значення Nothing (Нічого), якщо вона є змінною типу object (Об'єкт), або значення Empty (Пусто), якщо вона є змінною типу Variant

Оператор циклу for next VBA мови використовується для виконання блоку операторів фіксовану кількість разів, найчастіше цей цикл застосовується для обробки масивів. Цикл for next є у своїй сфері найпростішим, тут задається початкове та кінцеве значення, а також можна задати крок лічильника.

Давайте розглянемо загальний синтаксис:

For лічильник = початок To кінець
Оператори
Next лічильник

Лічильник- Тут ми вказуємо ім'я змінної, яка зберігатиме інформацію про кількість ітерацій (кількість виконаних походів циклу).

початок- Початкове значення лічильника, є числовим виразом

Кінець- Кінцеве значення лічильника, числове вираження, яке задає кількість проходів.

Крок– необов'язковий параметр, який дозволяє встановити крок виконання. Якщо цей параметр відсутній, то збільшення лічильника при кожному проході дорівнює одиниці. Використання кроку актуальне у разі, якщо потрібно шляхом перебору вирішити рівняння, так, можна встановити початкове значення 1, кінцеве 3 і крок 0,2.

В самому кінці циклу можна і не вказувати ім'я змінної (лічильник), але це актуально, якщо використовується вкладений цикл for це дозволить зробити код більш читабельним.

Для прикладу, створіть форму з двома текстовими мітками та однією кнопкою, у редакторі коду пропишіть:

Private Sub CommandButton1_Click() Dim i, j, a, b For i = 1 To 10 Step 2 a = a & i & " " Next i For j = 1 To 10 Step 3 b = b & j & " " Next j Label1 .Caption = a Label2.Caption = b Sub Sub Private Sub UserForm_Initialize() Label1.Caption = "" Label1.FontSize = 14 Label1.ForeColor = vbBlue Label2.Caption = "" Label2.FontSize = 14 Label2. Caption = "Значення" End Sub

У цьому прикладі, ми маємо два параметри циклу , у кожному задані однакові початкові і кінцеві значення, проте, у першому заданий крок 2, тоді як у другому – 3.

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

Private Sub CommandButton1_Click() Dim i, j, SummA, SummB For i = 1 To 10 SummA = SummA + i Next For j = 10 To 1 Step -1 SummB = SummB + j Next Label1.Caption = "Прямий порядок:"& SummA Label2.Caption = "Зворотній порядок: "& SummB End Sub

Тут ми обчислюємо суму чисел від 1 до 10 при прямому та зворотному порядку.

Досить часто при використанні оператора циклу for next VBA мови може виникнути ситуація, коли за заданої умови треба припинити перебір даних, у цьому випадку використовується вираз Exit For, наприклад:

У цьому прикладі використовується вкладений цикл VBA for next. У першому випадку відбувається підсумовування чисел від 1 до 100, у своїй підсумовування повторюється 100 раз. У другому випадку ми прописали умову за допомогою умовного оператора if – якщо сума більша за 10 тисяч, то зробити вихід із циклу.

Добре, тепер спробуємо написати практичніший приклад – розв'язання квадратного рівняння методом перебору:

Private Sub CommandButton1_Click() Const a = -2, b = 6, c = 20 Dim x, result, res For x = -10 To 10 Step 0.5 result = a * (x * x) + b * x + c If result = 0 Then res = res & " " & x End If Next x Label1.Caption = "х рівно: " & res End Sub

У цьому прикладі ми оголосили три константи a, b і з, зі значеннями -2, 6 і 20, це параметри квадратного рівняння (a*x*x + b*x + c = 0). У циклі відбувається зміна змінної х в діапазоні від -10 до 10 з кроком 0,5. При кожній ітерації відбувається перевірка умови на рівність нулю, якщо умова виконується, змінну res записується значення змінної x. У результаті рівняння матиме два рішення: -2 і 5.

І так, у цій статті ми розглянули цикл for next мови VBA, який застосовується для обробки заданої кількості разів одних і тих же дій, в наступній статті ми розглянемо, який використовується для обробки колекцій, там же ми розглянемо і самі колекції.

У цьому уроці буде розглянуто роботу з циклом Forу VBA. Приклад роботи з циклом For, так само буде продемонстрований приклад створення формул Excel за допомогою макросів.

Цикл Forпрацює за принципом лічильника. Forзастосовується в тих випадках, коли необхідно повторити деякі дії заздалегідь відоме у раз. Наприклад, цикл Forчасто використовується під час читання масивів.

Цикл Forмає наступний синтаксис:
For лічильник = початок циклу To кінець циклу [Step крок]
група операторів, команд та ін.
Exit For
Next лічильник

  • "лічильник" -змінна, яка змінюється на вказаний "Крок".Якщо крок не вказано, за замовчуванням береться одиниця.
  • "початок циклу", "кінець циклу" -числа або змінні вказують нижню межу лічильника та верхню. Зупинка циклу відбувається тоді, коли "лічильник" >"кінець циклу" (або, якщо цикл зворотний, тобто. з кроком -1, то "лічильник"< "кінець циклу").
  • Exit For –команда примусової зупинки циклу. Застосовується в тих випадках, коли сталася певна подія, після якої необхідно зупинити виконання команд у циклі, або для запобігання виникненню помилки.

Розглянемо пару прикладів використання циклу For. Надалі, з цим циклом зустрічатимемося досить часто.

Приклад 1
Дано два стовпці С і Е заповнені числами:

Необхідно скласти числа в стовпці С з числами стовпця Е наступним чином:
С2+Е21, С3+E20, …, C21+E2. Результат вивести стовпець D як формули тобто. зміст осередку результату має бути "=С2+Е21".

Код макросу виглядає наступним чином (куди прописувати код читаємо):

SubЦикл_For()
"константа вказує межу циклу тобто до якого значення циклу бігти
Const n = 21
For i = 2 To n
створюємо рядок формулу і зберігаємо її в осередок
Cells(i, 4) = "=C" & CStr(i) & "+E" & CStr((n - i) + 2)
продовження коли виконується в циклі
Next i
решта коду програми
End Sub

Розбираємо написаний код:

  • Const n = 21 – опис константи n зі значенням 21, тобто. число рядків по якому необхідно пробігтися циклу For;
  • For i = 2 To n - i лічильник, який буде змінюватися на 1 з кожним проходом циклу. Лічильник починається з 2 і закінчується коли i>n;
  • Cells(i, 4) - осередок виділеногоаркуша, i номер рядка, 4 -номер стовпця у який виводиться результат. Зверніть увагу, що наш лічильник i вказує номер рядка аркуша Excel;
  • Next i -оператор закриття циклу та перекладу покажчика до For.Все що знаходиться між Forі Nextвиконується у циклі;
  • CStr -функція, що перетворює число в текст.

Осередку ми привласнюємо формулу створену таким чином "=C" & CStr(i) & "+E" & CStr((n – i) + 2). Знак & - "склеювання" символів, рядків. В результаті в нас вийде формула = Сn + E ((n - i) + 2) де n = 21, i - лічильник.
Страшно? Це тільки здається:)

Усе. Після виконання макросу ми отримаємо наступний стовпець (виділений), а в кожному осередку формула:

Приклад 2
Тепер розглянемо цикл із зазначеним кроком. Після розрахунку минулого макросу ми отримали три стовпці, тепер нам необхідно відібрати від стовпця E D, у стовпець F вивести формули віднімання. Код макросу наступний:

SubЦикл_For_з_кроком()
Const n = 21
For i = n To 2 Step -1
Cells(i, 6) = "=E" & CStr(i) & "-D" & CStr(i)
Next i
End Sub

В даному випадку все те саме, тільки цикл тепер "біжить" не від 2, а від 21 до 2 з кроком (Step) -1.
Результат виконання отримаємо наступний:

Цикл ForУ VBA не є єдиним циклом. Надалі будуть розглянуті ще кілька варіантів циклів, без яких не обійтися при написанні макрокоманд в Excel.