Цикли VBA (ч.1). Команди організації циклів

Алгоритм циклу For….Next наведено на рис. 5.28.

Counter – будь-яка чисельна змінна VBA, зазвичай змінна типу Integer чи Long.

Start - будь-яке чисельне вираз і визначає початкове значення змінної Counter.

End - Чисельний вираз, що визначає кінцеве значення для змінної Counter .

Statements - Один, кілька або жодного оператора. Ці оператори виконують тіло циклу. VBA виконує кожен із цих операторів при кожному виконанні циклу.

Ключове слово Next

Counter=counter+StepSise

9.28. Алгоритм циклу For…

Ключове слово Next повідомляє VBA про те, що досягнуто кінець циклу. Не обов'язкова змінна Counter після ключового слова Next повинна бути тією ж змінною Counter, яка була задана після ключового слова For початку структури циклу.

Синтаксис:

For counter = Start To End

При виконанні циклуForNext VBAнадходить так:

Надає значення, представлене Star , змінної З ounter .

Виконує всі оператори, представлені за допомогою Statements , доки не досягне ключового слова Next . Ключове слово Next показує VBA те що, що досягнуто кінець тіла циклу.

Змінює змінну З ounter на величину StepSize (якщо включається необов'язкове слово Step) Якщо Step не визначено, VBA збільшує змінну counter на 1.

Повертається до початку циклу та порівнює поточне значення змінної З ounter із значенням, представленим End. Якщо значення З ounter менше значення End , VBA продовжує виконання з першого оператора після ключового слова Next .

9.2.4. Введення-виведення одновимірних та двовимірних масивів

Масив (array) – це колекція змінних, які мають спільне ім'я та базовий тип. Масив є зручним способом зберігання декількох пов'язаних елементів даних в єдиному контейнері для більшої зручності та ефективності програмування. Всі елементи даних, що зберігаються в масиві, повинні мати той самий тип.

Масив дозволяє зберігати та маніпулювати багатьма елементами даних за допомогою єдиної змінної. Крім зменшення загальної кількості різних імен змінних, які необхідно відстежувати, іншою основною перевагою використання масивів є те, що можна використовувати цикли для легкої обробки різних елементів масивів. Поєднуючи масиви та структури циклу (зазвичай For….Next) можна написати невелику кількість операторів, які обробляють великий обсяг даних. Виконання тих самих завдань із використанням окремих змінних може вимагати написання сотень операторів.

Розмірність масиву

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

Одновимірні масиви

Приклад одновимірного масиву наведено у таблиці № 9.9.

Таблиця №9.9

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

Для доступу до даних, що зберігаються в певному елементі масиву, слід вказувати ім'я масиву з наступним числом, яке називається індексом елемента. Індекс укладають у круглі дужки. Наприклад, якщо масив у таблиці № 1.1 має ім'я DoubleArray, наступний оператор присвоює число 45 змінної DoubleAny.

DoubleAny = DoubleArray (3)

У цьому операторі число 3 є індекс масиву. Оскільки нумерація елементів починається з нуля, елемент, на який посилається оператор, є фактично четвертим елементом масиву DoubleArray.

При виконанні оператора DoubleArray VBA вибирає значення 45 і зберігає це значення в змінній DoubleArray.

Цей же оператор можна використовувати при збереженні даних у масиві:

DoubleArray (5)=12.

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

Одновимірні масиви зазвичай використовуються для представлення різних списків даних.

Багатовимірні масиви

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

У двовимірному масиві адреса кожного осередку складається з двох чисел: номер рядка (перший індекс) та номер стовпця (другий індекс). У VBA можна створювати масиви до 60 вимірів.

Якщо масиві число елементів не змінюється, такий масив називається статичним.

Статичні та динамічні масиви

Якщо під час виконання VBA-програми можна змінювати кількість елементів у масиві, такі масиви називаються динамічними. Для зміни розміру динамічного масиву використовується оператор ReDim.

VBA зберігає зарезервовану область пам'яті для всіх елементів у масиві, доки існує змінна типу масиву. Подібні масиви називаються статичними (static), тому що кількість елементів у масиві не змінюється.

ОператорOption Base

Зазвичай VBA використовуються масиви з нульовою базою. Оператор Option Base дозволяє задавати 0 або 1 як початкове число за промовчанням для індексів масиву. Якщо оператор Option Base не використовується, VBA починає нумерацію індексів з 0 (за умовчанням). Перед оголошенням будь-яких змінних, констант або процедур необхідно помістити оператор Option Base в область оголошень модуля. Не можна розміщувати оператор Option Base всередині процедури. Можна мати лише один оператор Option Base у модулі.

Синтаксис:

Option Base 0|1

Оголошення масивів

Оголошення масиву за допомогою оператора Dimмає наступний синтаксис.

Синтаксис:

Dim VarName ()

Dim VarName (upper, upper]….)[ As type],

VarName – будь-яке ім'я для масиву, що відповідає VBA-правилам для імен ідентифікаторам.

Subscripts – вимір масиву.

As Type - тип даних.

Lower – нижня межа значення індексу.

Upper – верхня межа значення індексу.

Type – тип даних

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

Dim str_array (1 To 100) As String

Dim variant_array ()

Dim str_Multiplication (0 To 15, 0 To 15) As String

Використання масивів

Для доступу до елемента масиву необхідно вказати ім'я масиву, за яким слідує значення індексу, укладене у круглі дужки.

Звернення до елемента масиву має наступний синтаксис.

Синтаксису.

arrayName (validIndex1, ….)

validIndex – ім'я масиву.

validIndex1 – допустиме значення індексу першого вимірювання масиву.

validIndex2 – допустиме значення індексу другого вимірювання масиву.

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

Введення-виведення одновимірних масивів

При введенні одновимірного масиву необхідно послідовно вводити 1-й, 2-й і т.д. елементи масиву, аналогічно надходять під час виведення. Для введення чи виведення масиву необхідно організувати цикл. Найбільш зручно використовувати для введення та виведення одновимірного масиву алгоритм з використанням безумовного циклу.

Алгоритм введення виведення одновимірного масиву наведено на рис.5.29.

Розшифрування процедури наведено нижче.

Sub Massiv () – назва процедури.

Dim Mas (5) As Integer - оголосили одновимірний масив із 5-ма елементами, тип чисел – цілі.

Dim s As String – оголосили робочу змінну для завершального виведення даних із масиву у діалоговому вікні. As String – тип даних у змінній для зберігання.

For i = 1 To 5 – процедура у першому циклі For….Next, приймає цілі числа від 1 до 5 і заносить в масив.

Mas(i) = InputBox(i) – введення цілого числа для i-го елемента.

Next – перехід до другого циклу (елементи масиву заносяться в рядок та виводяться на екран у діалоговому вікні за допомогою оператора MsgBox).

For i = 1 To 5 – елементи у рядку з 1 до 5.

s = s & Mas(i) & ";" - Формування рядка з елементів масиву. Масив виводиться в один рядок. Елементи масиву поділяються символом ";".

MsgBox s – виведення раніше введеного масиву.

Рис.5.27. Алгоритм введення-виводу одновимірного

Мал. 9.29. Алгоритм та процедура введення-виведення одновимірного масиву

Введення-виведення двовимірного масиву

Алгоритм та процедура введення та виведення двовимірного масиву представлений на рис.5.30.

Опис цієї процедури:

Sub Massiv () – назва процедури

Оголошення змінних, що використовуються у цій процедурі:

Dim Mas (5, 5) As Integer - оголосили двомірний масив з 5 стовпцями та п'ятьма рядками, тип чисел – цілі.

Dim s As String – оголосили робочу змінну для завершального виведення даних із масиву у діалоговому вікні. As String – тип даних у змінній для зберігання

Next i - закінчення операції присвоєння змінних

Введення елементів масиву на згадку про комп'ютер:

For i = 1 To 5 – введення здійснюється з першого елемента першого рядка, потім другого і т.д.

For j = 1 To 5 до кінця першого рядка, потім з першого елемента другого рядка і т.д.

Mas(i,j) = InputBox(i,j) – оператор введення елементів масиву на згадку про ЕОМ

Мал. 9.30. Алгоритм та процедура введення-виведення двовимірного масиву

Алгоритми впорядкування масиву

Як приклад наведемо алгоритм та процедуру сортування одномірного масиву методом «бульбашка»

Виведення елементів введеного масиву з пам'яті ЕОМ:

For i = 1 To 5 – висновок здійснюється аналогічно до введення

s = s & Mas (i,j) & “; ”

s = s & Chr (13) – переклад рядка (виведення не одним рядком, а кількома, як у введеному масиві)

Next i – закінчення дії оператора For…

MsgBox s – виведення раніше введеного масиву на діалогове вікно

End Sub – закінчення процедури.

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

Оператор циклу з лічильником (For … Next)

Інструкція For … Next дозволяє циклічно виконати набір інструкцій (операторів) задану кількість разів. Синтаксис інструкції:

For лічильник = поч_значення To кінець_значення

[інструкції]

[інструкції]

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

Параметр лічильник– це числова змінна, що автоматично змінює своє значення на величину крокпісля кожного циклу повтору. Цикл виконується доти, доки лічильник£ кінець_значенняпри позитивному значенні параметра крокабо до тих пір, поки лічильник³ кінець_значенняпри негативному значенні параметра крок. Таким чином, цикл не виконається жодного разу, якщо за позитивного значення кроку поч_значеннябільше ніж кінець_значення. Якщо параметр Step крокопущений, то за умовчанням збільшення змінної-лічильника вважається рівним 1.

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

If умова Then Exit For

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

Приклад 1

Знайти суму перших 10 натуральних чисел: S = 1 + 2 + 3 + …+ 10 . Фрагмент програми:

Dim I as Integer, S as Integer

S = 0 " Обнулюємо значення змінної S

For i = 1 to 10 " Початок циклу. Задаємо початкове та кінцеве значення
"параметра циклу. Крок циклу за замовчуванням дорівнює 1.

S = S + i " Оператор присвоєння виконується за кожного
виконання циклу, в даному прикладі 10 разів

Next I " Кінець циклу. Значення параметра циклу збільшується на крок.

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

Приклад 2

Вивести в 1-й стовпець робочого листа (починаючи з 2-го рядка) значення х в діапазоні від 0 до 3,2 з кроком 0,4.

Public Sub Табуляція()

Dim x As Single, i As Integer

For x = 0 To 3.2 Step 0.4

Хоча довжина інтервалу точно ділиться на крок 0.4, результат на робочому аркуші має вигляд:

Що ж робити?

1. Можна трохи збільшити кінцеве значення, в даному прикладі замість 3.2 написати 3.201.

2. Визначити число повторень чикла та написати цикл за лічильником цілого типу.

В даному випадку програма набуде вигляду:

Public Sub Табуляція1()

Dim x As Single, i As Integer, n As Integer

n = CInt((3.2 - 0)/0.4)

For i = 0 To n Step 1

Cells(i + 2, 1) = x

Оператор циклу For Each … Next

Цикл For Each … Next дозволяє повторити виконання групи інструкцій для кожного елемента масиву чи сімейства. Ця інструкція має наступний синтаксис:

For Each елемент In група

[інструкції]

[інструкції]

Next [ елемент]

Параметр елемент– це змінна, яка є елементом сімейства чи масиву. Аргумент група- Ім'я масиву або сімейства. Інструкції виконуються лише один раз для кожного члена групи. Використання інструкції зручно тому, що не потрібно заздалегідь знати скільки елементів міститься в масиві або сімействі. Змінна елементповинен мати тип Variant.

Приклад 1

Знайти середнє арифметичне значення всіх елементів виділеного діапазону

Public Function Середнє(Діапазон As Range) As Double

Dim Елемент As Variant

Dim Сума As Double

Dim Кількість As Integer

Кількість = 0

For Each Елемент In Діапазон

Сума = Сума + Елемент

Кількість = Кількість + 1

Next Елемент

Середнє = Сума / Кількість

Застосування. У виділеному діапазоні суміжних осередків повинні бути числа. Числа в порожніх осередках вважаються рівними 0. Текст в осередку призведе до помилки.

Перераховані вище оператори If … End If, Select … Case, For … Next, For Each … Next є групою керуючих інструкцій, які змінюють порядок виконання команд. Керуючі інструкції можуть бути вкладені одна в одну у будь-якій послідовності.

У цьому уроці буде розглянуто роботу з циклом 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.

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

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:

Для 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.

Для X = 0 To 2.4 Step 0.2

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

M1: X = X + 0.2

If X<= 2.4 Then

Саме два останніх рядки коду виконуються в циклі For, але ми цього не бачимо. Ми закодували їх рядком з 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. Обчислення суми для заданого x:

Аналіз завдання показує, що ступінь при Х змінюється від 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і К, змінної P привласнюємо 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. Організація циклів.

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

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