Процедури
Програма може являти собою сукупність окремих блоків-підпрограм (процедур). Використання процедур дозволяє реалізувати один із самих прогресивних методів програмування - структурне програмування.
Процедури доцільно застосовувати у випадках, коли однакову послідовність дій необхідно виконувати в різних частинах програми й при різних вхідних даних. Таку послідовність дій можна виділити в самостійну програмну одиницю - процедуру, що може бути використана багаторазово в міру необхідності.
В VBA є 3 види процедур: процедура Function, процедура Sub і процедура Property. У даній роботі розглядаються тільки процедури Function і Sub.
Процедура Function
VBA містить безліч вбудованих функцій, наприклад, cos, sqr, mid, але користувач може створювати власні функції, використовуючи для цього процедуру Function.
Синтаксис поцедури Function:
[Private ½Public ½Static] Function Ім'я(Список аргументів) [As тип]
Блок операторів
End Function
Тут і далі ( означає, що використовується один з варіантів: Private, Public або Static.
Private - означає, що процедура Function доступна для інших процедур тільки того модуля, у якому вона описана.
Public - означає, що процедура Function доступна для інших процедур у всіх модулях.
Static – означає, що локальні змінні процедури Function зберігаються в проміжках часу між викликами цієї процедури.
Ім'я – ідентифікатор функції, що задовольняє стандартним правилам побудови імен;
Тип – тип значення, що повертається Function;
Список аргументів - список змінних, що представляють аргументи, які передаються в процедуру Function при її виклику. Аргументи в списку відділяються комами.
Структура аргументу:
[Optional] [ByVal ½ByRef] [ ParamАrray] Ім'я [As тип]
Optional - указує, що даний аргумент є необов'язковим. Аргументи, позначені кваліфікатором Optional, повинні перебувати наприкінці списку аргументів.
ByVal - означає, що аргумент передається за значенням. При цьому виключається можливість зміни значення аргументу процедури після її завершення.
ByRef – аргумент передається по посиланню. Передача аргументу по посиланню дає процедурі доступ до вмісту змінної за її адресою в пам'яті. Значення змінної може бути змінене процедурою, що викликається.
За замовчуванням установлюється ByRef.
ParamАrray - позначає необов'язковий аргумент, що є масивом довільного числа змінних типу Variant. Цей аргумент може бути тільки останнім у списку аргументів. З ним не можуть використовуватися ключові слова ByVal, ByRef, Optional.
Тип - тип аргументу, може використовуватися будь-який стандартний тип даних. За замовчуванням використовується Variant.
Приклади заголовка процедури-функції:
1) Function Sum(n Аs Integer, a As Single) Аs Integer
Ця функція – Public (за замовчуванням), доступна для всіх модулів. Ім'я функції – Sum, аргументи: n – цілого типу, а – числового, обидва аргументи мають кваліфікатор ByRef (за замовчуванням). Функція повертає значення типу Integer.
2)Private Function F1(a As Single, ParamArray x) As Single
Функція доступна тільки для модуля, у якому вона записана. Аргументи: а - числова змінна типу Single, х - масив довільного числа елементів типу Variant.Функція повертає значення типу Single.
Процедура Function може перебувати в будь-якому місці модуля, за винятком тіла іншої процедури. Викликається процедура по імені із вказівкою фактичних аргументів, у ролі яких можуть виступати константи, змінні, вирази. Виклик може перебувати усередині будь-якого виразу.
Виконання Function починається з першого рядка тіла процедури й триває доти, поки не буде досягнута інструкція End Function або Exit Function (вихід з Function). Далі управління передається в основну процедуру.
Процедура Function повертає в основну процедуру значення, присвоює ім'я Function оператором: ім'я = вираз. Цей оператор може бути записаний у тілі Function кілька разів, при цьому Function повертає останнє присвоєне значення. Якщо тип функції не заданий явно, то функція повертає значення типу Variant.
Формально Function повертає тільки одне значення, однак після виконання Function можна використовувати й модифікації аргументів, переданих в Function по посиланню (ByRef).
Приклад 1. Обчислити , визначення максимуму виконати в процедурі Function
Private Sub pp1()
Dim y As Single, a As Single, x As Single
a = Val(InputBox("Введіть а"))
x = Val(InputBox("Введіть x"))
y = (max(3.5, x + a) + max(x, a)) / max(x ^ 2, 120)
MsgBox "y=" & y
End Sub
Private Function max(b As Single, c As Single) As Single
If b > c Then max = b Else max = c
End Function
Приклад 2. Обчислити C = , де n>m. Визначення факторіала виконати в процедурі Function.
Private Sub pp2()
Dim n As Integer, m As Integer, c As Single
n = Val(InputBox("Введіть n"))
m = Val(InputBox("Введіть m"))
c = fact(n) / (fact(m) * fact(n - m))
MsgBox "c=" & c
End Sub
Private Function fact(n As Integer) As Single
Dim i As Integer, p As Single
p = 1
For i = 1 To n
p =p * i
Next I
fact=p
End Function
Процедура Sub.
Синтаксис процедури Sub:
[Private ½Public ½Static] Sub Ім'я([Список аргументів])
Блок операторів
End Sub
Загаловок Sub аналогічний заголовку Function, тільки в процедурі Sub не вказується тип процедури.
Процедура Sub не повертає значення, присвоює її імені, як це робить процедура Function, однак як і Function, Sub може змінювати значення аргументів, переданих до неї. Тому, якщо процедура Sub призначена для розрахунку якихось величин, то в списку аргументів процедури Sub повинні бути присутнім як вхідні аргументи, так і вихідні.
Процедура Sub, на відміну від Function, не може бути викликана по імені функції усередині виразу. Для її виклику використовується окремий оператор. Застосовуються 2 модифікації виклику:
1) Call Ім'я (Список аргументів)
2) Ім'я Список аргументів
Приклад 3. Знайти напівсуму довжин двох векторів З=(c1,c2,c3,c4) і D=(d1,d2,d3,d4,d5). Обчислення довжини вектора оформити, як процедуру Sub.
Позначення в процедурі обчислення довжини вектора: srv - ім'я процедури, x - вхідний масив з n елементами, s -довжина вектора. Позначення в основній процедурі: s1 - довжина вектора C, s2 - довжина вектора D.
Sub pp3()
Dim c(1 To 4) As Single
Dim d(1 To 5) As Single
Dim k As Integer, s1 As Single
Dim s2 As Single
For k = 1 To 4
c(k) = Val(InputBox("Введіть c(" & k & ")"))
Next k
Call srv(c, 4, s1)
For k = 1 To 5
d(k) = Val(InputBox("Введіть d(" & k & ")"))
Next k
Call srv(d, 5, s2)
MsgBox "rez=" & (s1 + s2) / 2
End Sub
Private Sub srv(x() As Single, n As Integer, s As Single)
s = 0
For k = 1 To n
s = s + x(k) ^ 2
Next k
s = Sqr(s)
End Sub
Дата добавления: 2015-03-03; просмотров: 862;