Цикли VBA. VBA Оператори циклу. Вкладені цикли Цикли в vb6 з лічильником приклади

Інструкція циклу є вказівкою, з якого ясно, який набір інструкцій (цей набір інструкцій називається тілом циклу) потрібно виконувати багаторазово і як правило закінчення виконання циклу.

7.2.1. Параметричний цикл For… Next

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

Синтаксис циклу: ForІСЦ = НЗВЦ ToКЗПЦ[ StepШИПЦ] Тіло циклу (одна або кілька інструкцій) Next[ІСЦ]

Слова For(Для), To(до), Step(крок), Next(потім) є зарезервованими.

Застосовано позначення:

ІСЦ - ім'я параметра циклу (змінна будь-якого числового типу);

НЗПЦ – початкове значення параметра циклу (вираз будь-якого числового типу), яке параметр циклу матиме при першому виконанні тіла циклу;

КЗПЦ - кінцеве значення параметра циклу (вираз будь-якого числового типу), з яким порівнюється поточне значення параметра циклу;

ШИПЦ – крок зміни параметра циклу (вираз будь-якого числового типу) – необов'язкова частина інструкції циклу.

Числові значення НЗПЦ та КЗПЦ задають інтервал, у якому змінюватиметься параметр циклу. Необов'язковий параметр ШИПЦ визначає крок зміни лічильника циклу на кожному проході. За замовчуванням, якщо він відсутній, то приймається рівним 1. Нарешті, після інструкцій, що становлять тіло циклу, слідує команда, що позначає межу дії циклу. У разі вкладених циклів (в тіло циклу входить інструкція циклу) корисно вказувати, до якого з них належить команда Next. Це досягається додаванням після слова Nextімені параметра циклу

Процес виконання інструкції ForNextдля позитивного кроку ілюструє рисунок 7.4.

Розглянемо приклади.

У першому прикладі запишемо інструкції для обчислення суми всіх цілих непарних чисел від 1 до 100.

Dim I As Integer, Сума As Integer

For i = 1 To 100 Step 2

Сума = Сума +i

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

Dim N As Integer

For N = 100 To 60 Step -10

Цей код виведе на поточній формі:

Наступна інструкція змушує комп'ютер подавати звуковий сигнал 50 разів. Інструкція Forвизначає, що параметром циклу є змінна x, її початкове та кінцеве значення. Команда Nextзмінює лічильник із кроком.

Dim x As Integer

Інструкцію For...Nextможна завершити достроково за допомогою інструкції Exit For. Виконання цієї інструкції призводить до негайного виходу із циклу.

7.2.2. Інструкція циклу Do While...Loop або Do...Loop While

Тут While(поки) та Loop(Цикл) зарезервовані слова. Цикли типу Whileпризначені для ситуацій, коли кількість повторень тіла циклу (ітерацій) наперед не відома. Ось синтаксис двох різновидів циклу While:

Do WhileУмова Повторення Група інструкцій Loop

DoГрупа інструкцій Loop WhileУмова Повторення

Відмінність між ними полягає в тому, що Умова Повторення (умова повторення виконання тіла циклу) перевіряється в першому випадку до виконання тіла циклу (цикл – поки що), а в другому – після виконання тіла циклу (цикл – до).

Перейдемо до прикладів.

Розглянемо дію наступної ділянки програми.

Лічильник = 0

Do While Номер > 10

Номер = Номер - 1

Лічильник = Лічильник + 1

MsgBox ("Виконано" & Лічильник & _

"ітерацій циклу.")

Під час виконання цієї ділянки програми у вікні функції MsgBox буде виведено:

Виконано 10 ітерацій циклу.

У програмі умова перевіряється до входу в цикл. Якщо змінною Номер задати значення, що дорівнює 9 замість 20, інструкції всередині циклу не виконуватимуться.

У наступній програмі інструкції всередині циклу виконуються лише один раз до того, як умова не буде виконана.

Лічильник = 0

Номер = Номер - 1

Лічильник = Лічильник + 1

Loop While Номер > 10

MsgBox ("У циклі виконано" & Лічильник & _

"ітерацій.")

Інструкцію Do...Loopможна завершити достроково за допомогою інструкції Exit Do.

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

Мови програмування надають різні структури управління, які забезпечують складніші шляхи виконання.

Оператор циклу дозволяє нам виконувати оператор чи групу операторів кілька разів. Нижче наведено загальний вигляд оператора циклу VBA.

VBA надає такі типи циклів для обробки вимог циклування. Натисніть наступні посилання, щоб перевірити деталі.

for цикл

Цикл for - це структура управління повторенням, яка дозволяє розробнику ефективно писати цикл, який необхідно виконати певну кількість разів.

Синтаксис

Нижче наведено синтаксис циклу for VBA.

For counter = start To end .... .... Next

Діаграма потоку

Нижче наведено потік управління в режимі Loop -

  • Перший крок виконується. Цей крок дозволяє ініціалізувати будь-які змінні керування контурами та збільшувати змінну лічильника кроків.
  • По-друге, умова оцінюється. Якщо це правда, виконується тіло циклу. Якщо воно помилкове, тіло циклу не виконується, і потік управління переходить до наступного оператора відразу після циклу For.
  • Після виконання циклу циклу For потік управління переходить до наступного оператора. Цей оператор дозволяє вам оновлювати будь-які змінні керування циклом. Він оновлюється з урахуванням значення лічильника кроків.
  • Умову тепер оцінюють знову. Якщо це правда, цикл виконується, і процес повторюється (тіло циклу, потім збільшують крок, а потім знову умова). Після того, як умова стає помилковою, цикл For закінчується.

приклад

Додайте кнопку та додайте наступну функцію.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2

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

The value is i is: 0
The value is i is: 2
The value is i is: 4
The value is i is: 6
The value is i is: 8
The value is i is: 10

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

for ... loop

Для кожного циклу використовується для виконання оператора або групи операторів для кожного елемента масиву або колекції.

Для кожного циклу аналогічний For Loop; однак цикл виконується для кожного елемента в масиві чи групі. Отже, лічильник кроків нічого очікувати існувати у цьому типі циклу. Він переважно використовується з масивами або використовується в контексті об'єктів файлової системи, щоб працювати рекурсивно

Синтаксис

Нижче наведено синтаксис циклу For Each у VBA.

For Each element In Group .... Next

приклад

Private Sub Constant_demo_Click() "fruits is an array fruits = Array("apple", "orange", "cherries") Dim fruitnames As Variant" iterating using For each loop. For Each Item In fruits fruitnames = fruitnames & Item & Chr(10) Next MsgBox fruitnames End Sub

Коли цей код виконується, він друкує всі імена фруктів з одним елементом у кожному рядку.

apple
orange
cherries

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

while..wend loop

У циклі While While ... Wend , якщо умова дорівнює True, всі оператори виконуються доти, доки не зустрінеться ключове слово Wend.

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

Синтаксис

Нижче наведено синтаксис циклу While..Wend у VBA.

While condition(s) ... Wend

Діаграма потоку

приклад

Private Sub Constant_demo_Click() Dim Counter: Counter = 10 While Counter< 15 " Test value of Counter. Counter = Counter + 1 " Increment Counter. msgbox "The Current Value of the Counter is: " & Counter Wend " While loop exits if Counter Value becomes 15. End Sub

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

The Current Value of the Counter є: 11
The Current Value of the Counter є: 12
The Current Value of the Counter є: 13
The Current Value of the Counter є: 14
The Current Value of the Counter є: 15

Це перевіряє перед виконанням тіла циклу.

Цикл do..while

Do ... while цикл використовується, коли ми хочемо повторити набір операторів, поки умова істинна. Умова може бути перевірена на початку циклу або наприкінці циклу.

Синтаксис

Нижче наведено синтаксис циклу Do ... While у VBA.

Do While condition ... ... Loop

Діаграма потоку

приклад

У наступному прикладі використовується цикл Do...while для перевірки стану на початку циклу. Оператори всередині циклу виконуються, тільки якщо умовою стає True.

Private Sub Constant_demo_Click() Do While i< 5 i = i + 1 msgbox "The value of i is: " & i Loop End Sub

The value of i is: 1
The value of i is: 2
The value of i is: 3
The value of i is: 4
The value of i is: 5

Альтернативний синтаксис

Існує також альтернативний синтаксис для Do...while loop, який перевіряє стан наприкінці циклу. Основне різницю між цими двома синтаксисами пояснюється в наступному прикладі.

Do ... ... Loop While condition

приклад

У наступному прикладі використовується цикл Do...while для перевірки стану в кінці циклу. Заяви всередині циклу виконуються хоча б раз, навіть якщо умова False.

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 MsgBox The value of i is: " & i Loop While i< 3 "Condition is false.Hence loop is executed once. End Sub

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

The value of i is: 11

Оператори do..While будуть виконуватися доти, доки умова дорівнює True. (Т. е.) Петля повинна повторюватися до тих пір, поки умова не буде False.

do..intil loop

Do ... intil цикл не буде використаний, коли ми хочемо повторити набір операторів, поки умова хибна. Умова може бути перевірена на початку циклу або наприкінці циклу.

Синтаксис

Нижче наведено синтаксис циклу Do..Until у VBA.

Do Until condition ... ... Loop

Діаграма потоку

приклад

У наступному прикладі використовується Do ... До циклу, щоб перевірити умову початку циклу. Оператори всередині циклу виконуються тільки в тому випадку, якщо умова є хибною. Він виходить із циклу, коли умова стає істинною.

Private Sub Constant_demo_Click() i = 10 Do Until i>15 "Condition is False.Hence loop will be executed i = i + 1 msgbox ("The value of i is: " & i) Loop End Sub

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

The value of i is: 11
The value of i is: 12
The value of i is: 13
The value of i is: 14
The value of i is: 15
The value of i is: 16

Альтернативний синтаксис

Існує також альтернативний синтаксис Do... До циклу, який перевіряє умову наприкінці циклу. Основне різницю між цими двома синтаксисами пояснюється наступним прикладом.

Do ... ... Loop Until condition

Діаграма потоку

приклад

У наступному прикладі використовується Do ... До циклу, щоб перевірити умову в кінці циклу. Оператори всередині циклу виконуються хоча б один раз, навіть якщо умова дорівнює True.

Private Sub Constant_demo_Click() i = 10 Do i = i + 1 msgbox "Ваше значення: " & i Loop Until i more15 "Condition is True.Hence loop is executed once. End Sub

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

The value of i is: 11

Оператори do..Until будуть виконуватися доти, доки умова False. (Т. е.) Петля повинна повторюватися до тих пір, поки умова не буде істинною.

Записи управління циклом

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

Контрольна заява та опис

Вихід для оператора

Вихід for використовується, коли ми хочемо вийти з For Loop на основі певних критеріїв. Коли Exit For виконується, керування переходить до наступного оператора одразу після циклу For Loop.

Синтаксис

Нижче наведено синтаксис Exit For Statement у VBA.

Діаграма потоку

приклад

У наступному прикладі використовується Exit For. Якщо значення лічильника досягає 4, цикл For Loop завершується, і керування переходить до наступного затвердження відразу після циклу For Loop.

Private Sub Constant_demo_Click() Dim a As Integer a = 10 For i = 0 To a Step 2 "i є Counter Variable і це incremented by 2 MsgBox ("The value is i is: " & i) If i = 4 Then i = i * 10 "This is executed on if i=4 MsgBox ("The value is i is: " & i) Exit For "Exited when i=4 End If Next End Sub

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

The value is i is: 0
The value is i is: 2
The value is i is: 4
The value is i is: 40

Завершує оператор циклу For та передає виконання в оператор відразу після циклу

Exit Do

Exit Do Заява використовується, коли ми хочемо вийти з Do Loops на основі певних критеріїв. Він може використовуватися як у Do Do ... While, так і Do ... До циклів.

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

Синтаксис

Нижче наведено синтаксис виразу Exit Do у VBA.

приклад

У наступному прикладі використовується Exit Do. Якщо значення лічильника досягає 10, вихідна лінія Do завершується, і керування переходить до наступного оператора відразу після циклу For Loop.

Private Sub Constant_demo_Click() i = 0 Do While i<= 100 If i >10 Then Exit Do "Loop Exits if i>10 End If MsgBox ("The Value of i is: " & i) i = i + 2 Loop End Sub

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

The Value of i is: 0
The Value of i is: 2
The Value of i is: 4
The Value of i is: 6
The Value of i is: 8
The Value of i is: 10

Завершує оператор Do While та передає виконання в оператор відразу після циклу

VBA. Організація циклів.

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

VBA підтримує циклічні конструкції двох видів:

  1. Цикли з фіксованим числом повторень ( цикли з лічильником).
  2. Цикли з невизначеним числом повторень ( цикли з умовою).

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

Фіксовані цикли

VBA надає дві керуючі структури для організації фіксованого циклу: For … Next (цикл з лічильником) та For Each … Next (цикл із перерахуванням).

Оператор For … Next це типовий цикл із лічильником, що виконує задану кількість ітерацій. Синтаксис оператора For … Next:

For<счетчик> = <начЗначение>То<конЗначение>

<блок операторов>

Next [<счетчик>]

Приклад використання оператора For … Next.

Лістинг 1. Оператор For … Next

‘ ЗАВДАННЯ: Скласти програму, яка отримує два числа від користувача.

' Складає всі числа в діапазоні, заданому цими двома числами, а потім

' відображає результуючу суму.

Sub sample7()

Dim i As Integer 'лічильник циклу

Dim sStart ‘початкове значення лічильника

Dim sEnd ‘кінцеве значення лічильника

Dim sSum As Long 'результуюча сума

sStart = InputBox(“Введіть перше число:”)

sEnd = InputBox(“Введіть друге число:”)

sSum = 0

For i = CInt(sStart) To CInt(sEnd)

sSum = sSum + i

Next i

MsgBox “Сума чисел від ” & sStart & ” до ” & sEnd & ” дорівнює: ” & sSum

End Sub

Оператор циклу For Each … Nextналежить категорії операторів об'єктного типу, тобто. застосовується насамперед до колекційоб'єктів, а також до масивів . Тіло циклу виконується фіксоване число разів, що відповідає числу елементів масиву чи колекції. Формат оператора For Each … Next:

For Each<элемент>In<группа> <блок операторов>Next [<элемент>]

Цикли з умовою (невизначені цикли)

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

  • Чотири види циклів Do..Loop, які відрізняються типом умов, що перевіряються, і часом виконання цієї перевірки.
  • Безперервний цикл While... Wend.

Цикл Do While … Loop – типовий цикл із передумовою. Умова перевіряється перед тим, як виконується тіло циклу. Цикл продовжує свою роботу, поки це<условие>виконується (тобто має значення True). Так як перевірка виконується на початку, тіло циклу може жодного разу не виконатися. Формат циклу Do While … Loop:

Do While<условие>

<блок операторов>

Loop

Лістинг 2. Цикл Do While … Loop

‘ ЗАВДАННЯ: Скласти програму, яка передбачає введення користувачем

довільної послідовності чисел. Введення має бути припинено

тільки після того, як сума введених непарних чисел перевищить 100.

Sub sample8()

Dim OddSum As Integer 'сума непарних чисел

Dim OddStr As String рядок з непарними числами

Dim Num 'для прийому введених чисел

OddStr = “” ’ініціалізація вихідного рядка

OddSum = 0 'ініціалізація суми OddSum

Do While OddSum< 100 ‘начало цикла

Num = InputBox("Введіть число:")

If (Num Mod 2)<>0 Then 'перевірка на парність

OddSum = OddSum + Num 'накопичення суми непарних чисел

OddStr = OddStr & Num & ” ”

End If

Loop

'висновок рядка з непарними числами

MsgBox prompt:=”Непарні числа: ” & OddStr

End Sub

Оператор Do … Loop Whileпризначений для організаціїциклу з постумовою. Умова перевіряється після того, як тіло циклу буде виконано хоча б один раз. Цикл продовжує свою роботу, поки<условие>залишається істинним. Формат циклу Do … Loop While:

Do<блок операторов>Loop While<условие>

Лістинг 3. Цикл із постумовою

' ЗАВДАННЯ: Скласти програму гри “Вгадай число”. Програма має випадковим

' чином генерувати число в діапазоні від 1 до 1000, користувач повинен

' вгадати це число. Програма на кожне число, що вводиться, виводить підказку

' "більше чи менше".

Sub sample8()

Randomize Timer ' ініціалізація генератора випадкових чисел

Dim msg As String ' рядок повідомлення

Dim SecretNumber As Long, UserNumber As Variant

Begin: SecretNumber = Round(Rnd * 1000) ‘ число, згенероване комп'ютером

UserNumber = Empty ‘ число, яке вводиться користувачем

Do ‘ ігровий процес

Select Case True

Case IsEmpty(UserNumber): msg = "Введіть число"

Case UserNumber > SecretNumber: msg = "Занадто багато!"

Case UserNumber< SecretNumber: msg = “Слишком мало!”

End Select

UserNumber = InputBox(prompt:=msg, Title:="Вгадай число")

Loop While UserNumber<>SecretNumber

' перевірка

If MsgBox(“Грати ще?”, vbYesNo + vbQuestion, “Ви вгадали!”) = vbYes Then

GoTo Begin

End If

End Sub

Цикли Do Until … Loop та Do … Loop Until є інверсіями раніше розглянутих циклів із умовою. У випадку вони працюють аналогічно, крім те, що тіло циклу виконується за хибному умові (тобто.<условие>= False). Формат циклу Do Until … Loop:

Do Until<условие> <блок операторов>Loop

Формат циклу Do … Loop Until:

<блок операторов>

Loop Until<условие>

Практичне завдання:Перепишіть програми з лістингів 10 та 11 з використанням інвертованих операторів циклу.

Цикл While … Wend також відноситься до циклів з умовою. Цей оператор повністю відповідає структурі Do While... Loop. Формат циклу While … Wend:

While<условие>

<блок операторов>

Wend

Відмінною особливістю цього оператора є неможливість примусового завершення (переривання) тіла циклу (оператор Exit Do не працює у циклі While…Wend).

Переривання циклу

Для дострокового завершення ітерації та виходу із циклу застосовується оператор Exit. Цей оператор застосовується в будь-якій циклічній структурі, крім While...Wend. Загальний синтаксис використання Exit для переривання циклу такий:

<начало_цикла>

[<блок операторов1>]

Exit (For | Do)

[<блок операторов2>]

<конец_цикла>

При виконанні оператора Exit цикл переривається, і керування передається оператору, що слідує за оператором<конец_цикла>. У тілі циклу може бути кілька операторів Exit.

Лістинг 4. Примусовий вихід із циклу

Sub sample9()

For i = 1 To 10000000

If i = 10 Then Exit For ‘ вихід із циклу, коли лічильник досягне 10

Next

Синтаксис оператора:

ForЛічильник= початок ТoКінець[StepКрок]

Блок_Операторів

NextЛічильник

Тут зазначено:

Forдля (обов'язкове ключове слово VB);

Toдо (обов'язкове ключове слово VB);

Блок_Операторів– один або кілька операторів, які називаються тілом циклу;

Лічильник -ціла змінна, яка вважає кількість циклів, що виконуються;

Початок кінець -початкове та кінцеве значення лічильника;

Stepкрок (ключове слово VB);

Крок –крок зміни лічильника; може бути негативним; параметр необов'язковий, тому що якщо крок дорівнює 1, можна Step Крокопустити;

Next – наступний (обов'язкове ключове слово VB, кінець запису оператора циклу).

Значення лічильника (Початок кінець)можуть бути чисельними константами чи змінними цілого чи речового типу, може бути негативними чи позитивними числами. Щоб тіло циклу виконалося хоча б один раз, має бути Початок ≤ Кінець,якщо Крок> 0 і Початок ≥ Кінець,якщо Крок< 0. Як тільки виявиться, що Лічильник>Кінець (якщо початок< Конец), виконання циклу закінчується. Якщо Початок =Кінець,цикл виконається один раз;

Приклад 9.1 .Обчислення функціїY = 2 – 1.5 Sinxпри зміні Х із кроком 0.2 у діапазоні .

Фрагмент програми з обчислення Y і виведення аргументу Х та функції Y:

For X = 0 To 2.4 Step 0.2

Y = 2 - 1.5 * Sin (X)

Щоб зрозуміти, як працює цей цикл, наведемо програму подібного циклу, створеного за допомогою оператораGoTo, міток, оператораIfThen.

M1: X = X + 0.2

If X<= 2.4 Then

Y = 2 - 1.5 * Sin (X)

Розберемо роботу цієї програми. Перший розрахунок Yнестандартний, як би випадає з циклу. Цикл починається після першої передачі управління GoToM1 на мітку М1. У рядку з міткою М1 аргумент Х збільшується на крок 0.2 і одразу йде перевірка, чи не перевищує нове значення кінцевого значення Х 2.4. Якщо не перевищує, то розрахунок Yповторюється з цим новим Х. Потім знову виконується оператор GoToM1 - передача управління в рядок з міткою М1. Ці повтори (цикли) розрахунку Y закінчаться, як тільки Х перевищить 2.4.

Тепер програму з Ifпорівняємо з циклом For ... Next.

For X = 0 To 2.4 Step 0.2

замінює собою два рядки

M1: X = X + 0.2

If X<= 2.4 Then

Саме два останніх рядки коду виконуються в циклі For, але ми цього не бачимо. Рядок коду GoTo M1 закодований словом Next X (буквально: наступний Х). Виходить компактна конструкція.

При використанні циклу For ... Next треба навчитися використовувати лічильник циклу при вирішенні різних завдань. Щоб збагнути, як можна використовувати лічильник для вирішення задачі, треба провести аналіз постановки задачі, знайти закономірності зміни деяких параметрів задачі.

Приклад 9.2 . Визначення суми елементів низки: .

Фрагмент програми:

S = 0 'S - сума ряду

For i = 1 To 16 ' лічильник i - це знаменник дробу

S = S + 1/i ' накопичення суми

Print "S = "; S ‘ виведення суми S на форму

При кожному значенні лічильника iвираз 1/iпослідовно формує елементи ряду, починаючи з 1.

Приклад 9.3 . Обчислення суми низки елементів
.

Фрагмент програми:

S = 0 'S - сума ряду

For i = 1 To 18 ' лічильник i - чисельник

S = S + i/(i + 1) ' знаменник більший за чисельник на 1

Print "S = "; S ‘ виведення суми S на форму

Приклад 9.4 . Обчислення суми: 5 + 8 + 11 + … + 32 + 35

Фрагмент програми:

S = 0 'S - сума ряду

For i = 5 To 35 Step 3 одержуємо арифметичну _

прогресію зі знаменником 3

Print "S = "; S

Приклад 9.5. Обчислення суми для заданого х:

Аналіз завдання показує, що ступінь при Х змінюється від 1 до 10. При цьому чисельник у коефіцієнті при Х більше ступеня на 1, а знаменник – на 2. Значення ступеня формуватимемо за допомогою лічильника i. Тоді можна скласти таку програму (фрагмент):

S = 1 'S - сума ряду

For i = 1 To 10 як лічильник i, змінюється ступінь при Х

S = S + (-1)^i*(i + 1)*x^i / (i + 2)

Print "S = "; S

ЦиклиForNextвикористовуються привведення, виведення іобробці масивів .

Приклад 9.6. Введення та виведення значень елементів масиву(N).

Фрагмент програми:

' Опускаємо привласнення змінної N значення, _

введеного на формі у текстове поле txtN:

B(i) = InputBox("Введіть елемент B(" & i & ")", _

"Введення масиву B(" & N & “)”)

Print " "; B(i);

Функція InputBox() виводить на екран діалогове вікно з кнопкою закриття, заданим повідомленням, полем введення, кнопками ОК,Відміна,заданим заголовком (або без нього). Якщо буде введено число 12 - розмір масиву N, то в нашому прикладі при першій появі це вікно матиме вигляд:

Як бачимо, повідомлення Введіть елемент (1)пропонує ввести значення одного елемента у текстове вікно. З'явиться вікно 12 разів, оскільки масив містить 12 елементів. Це випливає із заголовка форми. Індекс елемента (i) у запрошенні буде змінюватися від 1 до 12.

Якщо потрібно вивести на форму тільки значення елементів масиву (N), то тіло циклу буде складатися з одного оператора:

Перегляд елементів масиву для здійснення якихось дій також відбувається за допомогою оператора циклу For…Next.

Наведемо приклади обробки одновимірних масивів.

Приклад 9.7 . Визначення максимального елемента в масиві(M).

Виключаючи введення початкових даних та виведення результатів, коротко опишемо алгоритм:

    Оголосимо змінну Вmaх, в яку занесемо значення першого елемента масиву, і змінну Imax, якій надамо 1 - індекс першого елемента масиву.

    У циклі за допомогою оператора For…Next переглядаємо всі елементи масиву, починаючи з 2-го. Використовуючи оператор If ... Then, порівнюємо їх значення зі значенням, яке зберігається в змінній Bmax.

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

Після закінчення циклу в змінній Bmax буде значення максимального елемента, а в Imax – його індекс (номер).

Програма цієї частини алгоритму.

Bmax = B(1): Imax = 1

If B(i) > Bmax Then Bmax = B(i): Imax = i

Приклад 9.8. Визначення суми, твору та кількості позитивних елементів масивуD(M).

Змінні: S,P,K- відповідно сума, добуток та кількість позитивних елементів.

Алгоритмтакого визначення:

    Привласнюємо нуль змінної Sі К, змінної Привласнюємо 1. Як правило, завжди змінні, де накопичується сума, тут це Sik, перед циклом обнуляються, а змінним, в яких обчислюється твір, присвоюється 1.

    За допомогою циклу For…Next перебираємо всі елементи масиву і перевіряємо чи вони позитивні (D(i) > 0).

    Якщо виявиться, що елемент - позитивний, то додаємо його значення значення суми Sі зберігаємо нову суму в цій же змінній. Змінну Розмножуємо на позитивне значення елемента і зберігаємо також в змінній. А до змінної K додаємо 1 і зберігаємо нове значення у цій же змінній

Програмацій частині алгоритму має вигляд:

S=0: P=1: K=0

If D(i) > 0 Then

S = S + D(i) ‘ так відбувається накопичення суми _

позитивних значень елементів масиву D(i)

P = P*D(i) ‘ визначення твору позитивних

' елементів масиву

K = K + 1 ' цей оператор називають ЛІЧИЛЬНИКОМ, тут він

' визначає кількість позитивних елементів масиву

Приклад 9.9. Визначення суми, твору, кількості та середнього значення непарних елементів масивуD(M).

Наведемо фрагмент програми такого визначення.

S=0: P=1: K=0

If D(i) Mod 2<>0 Then

Ssr = S/k ' обчислення середнього значення непарних елементів

Порівняйте цей фрагмент програми з програмою Прімера 9.8. Ця програма майже повністю повторює попередню. Змінено лише умову оператора If. Умова D(i) Mod 2<>0 означає, що шукаємо елементи масивуD(i), які діляться націло на 2, т. е. непарні елементи. Якщо перевірятимемо умовуD(i) Mod 2 = 0, то ми будемо відбирати парні елементи масиву.

Як відомо, розподіл по Modдає в результаті залишок від розподілу в цілих числах. Наприклад, після виконання оператора d = 34Mod4 змінна d буде дорівнює 2. Тому для відбору елементів масиву, які кратні 4, треба перевіряти умову D (i) Mod 4 = 0. Аналогічною буде умова, якщо шукатимемо елементи, кратні іншим числам. Замість 4 будуть записані інші цифри.

Приклад 9.10. Запис елементів масивуR(N), кратних 5, в інший масив та виведення нового масиву на форму.

Інший масив позначимо, наприклад, R5(N). Розмір цього нового масиву слід прийняти таким самим, як вихідний, тому що в граничному випадку всі елементи можуть бути кратними 5.

Алгоритм завдання:

    Обнулюємо лічильник k. За допомогою оператора циклу For ... Next переглядаємо всі елементи масиву R (N).

    Кожен елемент перевіряємо на кратність 5, використовуючи оператор If ... Then і поділ елемента масиву по Mod.

    Якщо елемент кратен 5, то за допомогою лічильника типу k=k+ 1 формуємо індекси масиву R5(N), починаючи з 1, і записуємо його в інший масив –R5(N).

    Якщо kвідмінно від нуля, виводимо масив R5() на форму.

    Якщо ж дорівнює нулю виводимо: «Немає елементів, кратних 5».

Фрагмент програми:

If R(i) Mod 5 The k = k + 1: R5(k) = R(i)

If k<>0 Then

Print “Немає елементів, кратних 5”

Цикли можуть бути вкладені в інші цикли.

Продемонструємо роботу вкладених циклів . Нижче у програмі організовано виведення значень лічильників цикловi,jіk. З результатів выводаi,j,k стає зрозуміло, як виконуються вкладені цикли.

Private Sub frmCycle_DblClick()

ScaleMode = 4 'одиниці виміру – символи

For i = 1 To 3 'зовнішній цикл

Print "i="; i;

For j = 1 To 4 '1-й вкладений цикл

CurrentX = TextWidth("i = 1") + 5

Print "j="; j;

CurrentX = TextWidth("i = 1 j = 1") + 7

For k = 1 To 5 '2-й вкладений цикл

На зображеній формі (рис. 1) наведено результати виведення лічильників всіх трьох циклів: зовнішнього циклу – лічильник i, першого вкладеного циклу – лічильникjі другого, самого внутрішнього циклу – лічильникk. Як бачимо, "найповільніший" лічильник у зовнішнього циклу(поi), а найшвидший - лічильник самого внутрішнього циклу (поk).

Програма виконується після подвійного натискання лівою кнопкою миші за формою frmCicli.

CurrentX, CurrentY – властивості форми, що задають координатиX,Yточки початку виведення інформації методомPrint(див. на рис.1 розташування осейXіYна формі).

TextWidth() – функція, що повертає ширину тексту, заданого функції як аргумент у подвійних лапках.

Вкладені цикли застосовуються при обробці двовимірних масивів (матриць). Але в деяких завданнях, крім введення та виведення елементів двовимірного масиву, можна обмежитися і одним циклом. Розглянемо деякі приклади програмування матриць.

Приклад 9.11. Введення та виведення матриці (двовимірного масиву) цілих чиселintA(N).

Вводити матрицю можна по рядках та по стовпцях . Найпростіше – по рядках, якщо програмуватиметься виведення елементів масиву на форму відразу після їх введення.

Введення та виведення матриціза рядками – фрагмент 1.

Dim M As Integer, N As Integer, i As Integer, j As Integer

Dim intA() As Integer ' оголошуємо динамічний масив

M = Val(txtN.Text) ‘ M – кількість рядків

N = Val(txtN.Text) 'N - кількість стовпців

ReDim intA(M, N) As Integer ‘ перевизначаємо масив

For i = 1 To M ‘ i зберігатиме своє значення, доки повністю

'не виконається вкладений цикл j

Print " "; intA(i, j); ‘ висновок за рядками

Print ‘ перехід на початок нового рядка

Щоб вводити матрицю по стовпцях, слід зробити зовнішнім цикл по j (задає номери стовпців), а внутрішнім – цикл поi (задає номери рядків).

Введення та виведення матриціпо стовпцях фрагмент 2.

PrY = 2500: CurrentY = PrY ‘ PrY задає координату Y початку

виведення першого елемента кожного стовпця на формі

For j = 1 To N ‘ j зберігатиме своє значення, доки повністю

'не виконається вкладений цикл з i

intA (i, j) = InputBox("Введіть елемент intA(" & i & “,” & j & ")", _

"Введення матриці intA(" & M & “,” & N & ")")

Print Tab (6 * j); intA(i, j) ‘ висновок по стовпцях

CurrentY = PrY ‘ для виведення першого елемента

наступного стовпця

У цьому другому фрагменті програми не повторюються 5 перших рядків першого фрагмента. Функція Tab(6 * j) встановлює початок виведення у рядку (у символах), починаючи з лівого краю форми. Координата PrY тут дорівнює 2500 твіпів, але можна підібрати й інше значення.

Приклад 9.12 . Впорядкування значень елементів масивуV(N) за зростанням.

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

Фрагмент програми, що реалізує цей алгоритм:

For i = 1 To N - 1

For j = i + 1 To N

If V(j)< V(i) Then P = V(i): V(i) = V(j): V(j) = P

Пояснимо цей фрагмент програми.

За допомогою зовнішнього циклу з лічильником iвибираємо елементV(i) для порівняння з наступними елементами. Внутрішній цикл з лічильником j вибирає для порівняння наступні елементи V (j). Початкове значенняjрівноi+ 1. Це перший елемент із наступних.

Для обміну значень елементів V(i) і V(j) вводимо деяку змінну P, у якій тимчасово «ховаємо» значення однієї з елементів масиву (у програмі – це V(i)). Потім елементу V (i) присвоюємо значення елемента V (j), а елементу V (j) присвоюємо значення V (i), яке зберігається в змінній P. Якщо «сховаємо» в значення V (j), то код за обміном значеннями буде таким: P = V (j): V (j) = V (i): V (i) = P. Результат не зміниться.

Щоб впорядкувати масив за спаданням, Досить умова для перевірки написати у вигляді V (j) > V (i), тобто змінити знак нерівності на інший.

Якщо масив буде не числовий, а рядковий, і елементи масиву будуть введені прізвища, то за програмою прикладу 9.12, можна впорядкувати список прізвищ по алфавіту. Справа в тому, що для букв алфавіту, що використовуються в комп'ютері, справедливі нерівності: А< Б < В < Г….< Я и т. д., поскольку числовые коды букв алфавита последовательно увеличиваются, начиная с А и до конца алфавита. Это же справедливо и для букв английского алфавита.

Приклад 9.13 . Обчислення суми позитивних елементів для непарних стовпців матриціF(M, N) та виведення сум на форму.

Алгоритм програми:

    Використовуючи зовнішній цикл з кроком 2 формуємо індекс непарних стовпців матриці, починаючи з першого стовпця.

    Обнуляємо суму S, у якій накопичуватиметься сума позитивних елементів.

    У внутрішньому циклі перевіряємо знак елемента масиву.

    Якщо елемент масиву позитивний (>0), обчислюємо суму S.

    Після закінчення внутрішнього циклу виводимо суму Sна форму.

Фрагмент програми:

For j = 1 To N Step 2

If F(i,j) > 0 Then S = S + F(i,j)

Print “Сума стовпця”; j; ":"; S ' j – номер стовпця!

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

Приклад 9.14. Є 1801 руб. Скільки можна придбати шоколадок по 31 руб. і булок по 18 руб., Аби повністю витратити всі гроші.

Програма:

Сума = 1801

ВсіШоколадки = Сума \ 31: ВсіБулки = Сума \ 18

For i = 1 To ВсіШоколадки

For j = 1 To ВсіБулки

Ціна = i * 31 + j * 18 'загальна ціна покупки

If Ціна = 1801 Then

Print "Шоколадок:"; i; Tab(19); "Булок:"; j

Пояснимо програму, де використовуємо змінні, названі російською.

Спочатку визначаємо, яку максимальну кількість тільки шоколадок чи тільки булок можна купити на всю суму. Отримані значення ВсеШоколадки і ВсеБулки використовуємо обмеження кількостей переборів за кількістю шоколадок і булок. Для кожних значень кількості шоколадок (i) та кількість булок (j) визначаємо загальну ціну для їх покупки. Якщо розрахована Ціна дорівнює 1801, то підібраний варіант є одним із розв'язків задачі.

Функція Tab() вказує, з якої позиції від краю форми буде виведення інформації, що йде за цією функцією. ЯкщоTab(19), то з 19-ої позиції.

Програма виводить 3 можливих варіантівпокупки:

Шоколадок 7, булок 88

Шоколадок 25, булок 57

Шоколадок 43, булок 26

Якщо потрібно дати однозначну відповідь, треба сформулювати додаткову умову. Наприклад, "булок було куплено менше, ніж шоколадок". Тоді єдиним рішенням буде третій варіант.

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

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

У VBA існують два основних типи циклів – цикли з лічильником (параметричні) та цикли з умовою (ітераційні).

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

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

Цикли з параметром For … Next

Структура циклу:

For Параметр_Цикла = Початкове_Значення To Кінцеве_Значення

[ Step Крок]

Оператори

[ Exit For ]

Next [Параметр_Цикл]

де For – ключове слово VBA (від), що означає початок циклу;

Параметр_цикла – змінна, визначена як лічильник циклу;

Початкове_Значення - число, що задає початкове значення параметра циклу;

To – ключове слово VBA (до), що розділяє

Початкове_значення та Кінцеве_Знання;

Кінцеве_Значення - число, що задає значення параметра циклу,

При якому цикл завершується;

Step – ключове слово VBA (крок), що використовується для

Завдання кроку циклу, необов'язковий аргумент;

Крок – число, яке задає крок циклу, тобто. значення, на яке

Збільшується (або зменшується) значення параметра

Цикл на кожному кроці. Це число може бути

Негативним;

Exit For - Оператор дострокового виходу з циклу (необов'язковий);

Next – ключове слово VBA (наступний), що позначає

Кінець циклу.

Робота циклу:

Крок 1 Спочатку визначається параметр циклу, а також обчислюються та запам'ятовуються початкове та кінцеве значення цієї змінної.

Крок 2 Параметру циклу надається початкове значення.

Крок 3 Початкове значення циклу порівнюється з кінцевим значенням.

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

Крок 4 Виконується тіло циклу.

Крок 5 Після виконання тіла циклу відбувається надання параметру циклу наступного значення. Перехід до кроку 3.

Примітка.

1. Якщо використовується ключове слово Step , то параметр циклу змінюється відповідно до числа, вказаного після цього слова. Якщо слово Step відсутня, то значення кроку дорівнює одиниці.

приклад 1.

For I = 0 To 10 Step 2 (Значення I буде збільшуватися на 2)

2. Цикл For … Next може бути перервано достроково при досягненні будь-якої умови. Для цього у потрібному місці циклу потрібно помістити оператор Exit For.

приклад 2.

Dim S As Integer

Dim j As Integer

S = 2

For j = 1 To 10

S = S + j

If S > 6 Then

Exit For (Вихід із циклу, якщо значення S> 6)

End If

Next j

MsgBox (S)

Цикли з умовою (ітераційні)

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

У VBA є два основних цикли DO … LOOP - з умовою, що вводиться ключовим словом While , і з умовою, що вводиться ключовим словом Until . Обидва можуть бути з передумовою або з постумовою.

Синтаксис:

де Do - Ключове слово (робити);

While – ключове слово (поки що);

Until – ключове слово (доки);

Loop - Ключове слово, що вказує на закінчення циклу;

<условие>- Логічне вираз, істинність якого перевіряється

На початку кожного виконання тіла циклу;

<тело_цикла>- Довільна послідовність операторів;

Конструкція Do … While читається: робити поки що виконується умова. У конструкції Do … While For

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

Умова, записана після ключового слова Until , перевіряється наприкінці кожної ітерації (після виконання тіла циклу). Звернути увагу, що воно працює тут не зовсім так, як у циклі While . Якщо умова є істинною ( True ), виконання циклу завершується. Якщо умова не виконується (є помилковим – False ), то знову виконується тіло циклу.

приклад 1.

Постановка задачі. Обчислити суму кінцевого ряду за допомогою підпрограми-процедури.

Технологія виконання завдання:

1. Вихідні дані: i  Z

Результат: S  R .

2.Набрати в стандартному модулі проекту наступну користувальницьку процедуру, використовуючи цикл із передумовою While:

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do While i<= 10

S = S + i^2

i = i + 1

Loop

MsgBox (S)

End Sub

3.Набрати в стандартному модулі проекту наступну користувальницьку процедуру, використовуючи цикл із передумовою Until:

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

Do Until i > 10

S = S + i^2

i = i + 1

Loop

MsgBox (S)

End Sub

4 Набрати в стандартному модулі проекту наступну процедуру користувача, використовуючи цикл з постумовою While:

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i^2

i = i + 1

Loop While i<= 10

MsgBox (S)

End Sub

5 Набрати в стандартному модулі проекту наступну процедуру користувача, використовуючи цикл з постумовою Until:

Sub summa()

Dim S As Integer

Dim i As Integer

S = 0

i = 1

S = S + i^2

i = i + 1

Loop Until i > 10

MsgBox (S)

End Sub