Основы и принципы работы в VBA. Часть 2: Методические указания к выполнению лабораторных работ, страница 6

Процедуры типа Function (Функция) вызываются по имени из любой процедуры типа Subили из других процедур типа Function.

Процедуры Functionв этом отношении не отличаются от встроенных функций Visual Basic, но разрабатываются пользователем; они могут содержать аргументы, через которые получают входные значения.

Процедуры типа Sub (Подпрограмма) вызываются по имени из других процедур, они могут содержать аргументы, получать входные значения, выполнять определенные действия.

Использование процедур уменьшает объем программы, улучшает ее структурированность. Облегчается отладка программ, так как  работу каждой процедуры можно проверить по отдельности. По сути, процедуры – это новые операторы или операции языка, определенные программистом.

8.1.1. Создание процедур-функций типа Function

Для создания процедуры  функции Function (рис. 8.1) необходимо выбрать пункт меню Insert (Вставка) → Procedure (Процедура).

Процедура Functionпредставляет собой группу операторов, содержащихся между операторами Functionи EndFunctionв стандартном модуле. Как и стандартные функции, процедура Functionявляется частью выражения и всегда записывается в правой частиоператора присваивания.

Синтаксис процедуры-функции Function:

Function имя_функции ([список формальных параметров]) [As  Type]

           Телофункции   (строки кода)

           Имя функции = Возвращаемое значение

End  Function

Рис. 8.1. Вид окна для создания процедуры типа Function

 


Каждая функция-процедураначинается ключевым словом Function, за которым следует имя функции, а затем  – список ее аргументов, заключенных в круглые скобки, который является необязательным. Typeлюбой тип возвращаемого значения функции. В теле функции последней исполняемой командой является функция присваивания: Имя функции = Возвращаемое значение. В результате ее выполнения имени функции присваивается значение выражения соответствующего типа, которое  и  возвращает функция.

Объявление функции заканчивается ключевыми словами EndFunction.

П р и м е р 1. При вычислении выражения

необходимо три раза найти квадратный корень от различных аргументов.
В общем виде  корень можно записать, как  и далее определить функцию:

.

Тогда .

Текст программы:

Option Explicit

Sub PR1()

Dim w As Single, x As Single, y As Single, z As Single

x = Val(InputBox(" x="))

y = Val(InputBox(" y="))

z = Val(InputBox(" z="))

w = Fsqr(x, y) + Fsqr(y, z) + Fsqr(z, x)

MsgBox (" w=" & w)

End Sub

Процедура пользователя запишется следующим образом:

Function Fsqr(a, b) As Single

Fsqr = Sqr(a ^ 2 + b ^ 2 + Sin(a * b))

End Function

В процедуре Function Fsqr() a и bявляются формальными параметрами. При обращении к процедуре  Fsqr() в подпрограмме Sub PR1() переменные
 x, y, z являются фактическими параметрами, совпадающими с формальными параметрами  a и  b по типу, количеству, порядку следования.

8.1.2. Создание процедуры-подпрограммы Sub

Синтаксис процедуры-подпрограммы Sub:

Sub Имя_процедуры   ([аргументы])   

операторы процедуры

End  Sub

При вызове процедуры количество и тип аргументов, переда­ваемых в процедуру Sub, должны соответствовать количеству и типу аргументов, указанных в объявлении процедуры. Если переданные в процедуру Subзначения переменных будут изменены в ходе вы­полнения процедуры, то измененные значения возвращаются в программу. По умолчании процедуры типа Sub, объявленные в стандартном модуле, являются общедоступными, поэтому они мо­гут быть вызваны из любой процедуры.

Для того чтобы вызвать процедуру типа Sub, необходимо использовать оператор, представляющий собой имя вызываемой процедуры, указав список требуемых аргументов. Переда­ча переменной процедуре Sub называется передачей аргумента по ссыл­ке (по умолчании), поскольку переменная может быть модифици­рована в ходе выполнения процедуры и уже измененной возвращена
в программу.

Любую переменную можно передать по значению, если для этого в
списке аргументов при объявлении процедуры использовать ключевое слово ByVal. Применение ключевого слова ByVal перед описанием переменной
позволяет сохранить копию оригинала аргумента и вернуть ее неизменной по окончании процедуры, даже если переменная была модифицирована в ходе выполнения процедуры.

Такое объявление аргументов в процедуре обеспечивает большую гибкость в программировании, так как переданную с параметром
ByVal переменную можно модифицировать в процедуре, а в программе она останется неизменной.

Параметры, передающиеся по ссылке, – это параметры, значения которых вычисляются в подпрограмме и передаются из нее в другие подпрограммы. Перед таким параметром ставится ключевое слово ByRef.

П р и м е р 2. Вычислить:   ,

где s1 и k1 – сумма и количество нечетных чисел в диапазоне от 10 до 79;

s2 и k2 – сумма и количество нечетных чисел в диапазоне от  –5 до –38.

Программный код

Основная  подпрограмма:

Option Explicit

Sub PR2()

Dim s1 As Single, s2 As Single, k1 As Single, k2 As Single

Dim s As Single, n As Integer, m As Integer, k As Integer

Dim f As Single, l As Integer

n = Val(InputBox(“n=”))

‘Начало  диапазона

m = Val(InputBox(«m=»))

‘Конец   диапазона

l = Val(InputBox(«l=»))

‘Шаг  изменения

Call pg (n, m, l, s, k)

‘Обращение к подпрограмме  с входными фактическими параметрами: n – начало диапазона, m – конец диапазона, l – шаг изменения; параметры, передаваемые  из подпрограммы  pg: s – сумма нечетных чисел в диапазоне,  k – количество нечетных  чисел в диапазоне.

s1 = s: k1 = k

‘Сохранение результатов работы подпрограммы  pg(значений s и k)

n = – 5: m = – 38: l = –1

‘Ввод шага и нового диапазона.

Call pg (n, m, l, s, k)

‘Обращение к подпрограмме с новыми данными.

s2 = s: k2 = k

‘Сохранение результатов работы подпрог-раммы  pg(значений s и k).

f = s1 * s2 / (k2 – k1) + 35.6

‘Расчет окончательного значения.

MsgBox (“f=” & f)

End Sub

Вызываемая  подпрограмма:

Sub pg (ByVal n1 As Integer, ByVal m1 As Integer,  ByVal l1 As Integer,  ByRef ss As Single, ByRef kk As Integer)         ‘n1, m1, l1 – формальныепарамет-

ры,  передающиеся по  значению; ss, kk  – параметры, передающиеся  по ссылке

Dim I As Integer

       ss = 0 :  kk = 0

        For I = n1 To m1 Step l1

                       If I Mod 2 <> 0 Then ss = ss + I: kk = kk + 1

         Next i

End Sub