ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 23.03.2025
Просмотров: 1054
Скачиваний: 2
Способ вызова процедуры Sub производится с помощью инструкции
ИмяПроцедуры СписокФактическихПараметров
или
Call ИмяПроцедуры (СписокФактическихПараметров)
Обратите внимание, что в этом случае список фактических параметров заключается в скобки. В первом способе скобки не использовались.
СписокФактическихПараметров - это список из имѐн пере-
менных, массивов, констант, которые передаются в вызываемую процедуру (которые она реально обрабатывает). VBA позволяет вводить фактические параметры через имена аргументов в любом порядке и опускать необязательные (optional). При этом после имени аргумента ставятся двоеточие и знак равенства, после которого помещается значение аргумента (фактический параметр).
Процедура Sub – это аналог макроса. Для еѐ выполнения надо обратиться к имени процедуры в меню макросов или набрать ранее назначенную комбинацию клавиш.
При создании процедур необходимо учитывать следующие правила:
-процедура может не иметь списка формальных параметров; -процедура может иметь фиксированное количество аргументов в списке формальных параметров; -процедура может иметь неопределенное количество аргументов в списке формальных параметров;
-не все аргументы в списке формальных параметров процедуры являются обязательными;
136
-все аргументы в списке формальных параметров могут быть необязательными.
Процедура типа Function, в отличие от процедуры типа Sub, обязательно возвращает значение определѐнного типа в вызывающую процедуру. Чтобы вызвать функцию достаточно обратиться к ней по имени. Например, y=sin(x) (вызывает встроенную функцию синуса).
Процедура типа Function универсальна и используется в двух ситуациях:
как часть выражения в процедуре VBA;
в формулах, которые создаются на рабочем листе. Процедуру типа Function можно использовать везде, где при-
меняются функции Excel и встроенные функции VBA. . Как и встроенные функции, процедуры типа Function имеют аргументы.
[Private | Public] Function Имя (СписокФормальныхПараметров)_
As ТипПеременной
[Инструкции]
End Function
Область определения переменной и процедуры
Область определения переменной задает область, в которой может быть использована переменная. В VBA имеется три соответствующих уровня переменных:
1.Переменные уровня процедуры (private) используются только внутри процедуры, в которой они описаны при помощи инструкции Dim, размещенной в процедуре.
2.Переменные уровня модуля используются только в модуле, в котором они описаны при помощи инструкции Dim,
137
размещенной в области описания модуля, т. е. перед описанием процедур.
3.Общие переменные, используемые во всех модулях данного проекта. Описываются при помощи инструкции Public, размещенной в области описания модуля.
Время жизни переменной
Личная (private) переменная сохраняет свои значения, только пока выполняется процедура, в которой эта переменная описана. При завершении процедуры значение переменной теряется, и при повторном запуске процедуры его надо заново инициализировать. Переменные, описанные при помощи инструкции Static, сохраняют свое значение по выходу из процедуры, но пока работает программа
Приведенный ниже пример показывает основные способы передачи параметров в процедуры.
Пример 1
Dim с As Double |
' с - глобальный параметр |
Function F(ByVal x As Integer) As Integer
F = x ^ 2
End Function
'**********************
Sub Assistant(ByVal a As Integer, ByVal b As Integer)
'Процедура, находящая сумму двух чисел и выводящая
'результат в диалоговом окне
с = а + b
138
MsgBox CStr(c)
End Sub
Sub Main ()
'Процедура, находящая сумму двух чисел и выводящая
'результат в диалоговом окне
Dim x, у As Double
'x, у —фактические параметры
'Вызов процедуры с числами как фактическими параметрами
Assistant 1, 3
'Первоначальное присвоение переменным значений,
'с последующим вызовом процедуры
х = 1: у = 1 Assistant x, у + 2
' Использование процедуры как фактического параметра
х = 1: у = 3
Assistant F(x), у
' Вызов процедуры с указанием фактических параметров по имени
Assistant a:=l, b:=3
End Sub
Приведем пример (пример 2) процедуры с необязательными параметрами. Функция с именем СторонаТреугольника позволяет найти длину недостающей стороны прямоугольного треугольника, где переменные А и В отведены под длины катетов, а переменная С
— под гипотенузу. Например, формула Excel
=СторонаТреугольника(;В2;С2)
139
вычисляет катет А по введенным в ячейки В2 и С2 длинам катета В и гипотенузы С. При работе с необязательными переменными необходимо использовать функцию isMissing, возвращающую значение True, если соответствующий аргумент не был передан в процедуру, и False в противном случае.
Пример 2.
Function СторонаТреугольника(Optional A,_Optional В, Optional С)
If Not (IsMissing(A)) And Not (IsMissing(В)) Then
СторонаТреугольника = Sqr(А ^ 2 + В ^ 2)
End If
If Not (IsMissing(A)) And Not (IsMissing(C)) Then
СторонаТреугольника = Sqr(С ^ 2 - А ^ 2)
End If
If Not (IsMissing(B)) And Not (IsMissing(C)) Then
СторонаТреугольника = Sqr(C ^ 2 - В ^ 2)
End If
End Function
Составить фрагмент программы вычисления следующих функций с помощью процедуры типа функция:
C |
4,5ex2 |
D |
1 |
|||||||||
и |
x4 |
4 |
3 |
|||||||||
e |
x |
8,5 sin( x) |
8 e |
sin( x |
) |
x |
||||||
Фрагмент процедуры типа Function
'описание функции
Function FNС (ByVal A As Double, ByVal X As Double, _
ByVal Z Double)As Double
140
FNC= A EXP (X) + Z SIN (X)
End Function
'использование функции
…
C = FUN( A, X2, 0. ) / FUN( 1., X, 8.5 )
B = -1.
D = 1/(FUN (8., X4, B) + X 3)
. . .
Функция с именем FNC и формальными параметрами А, Х, Z оформлена в данном примере в виде функции а∙ех + z∙sin x. В дальнейшем эта функция используется при вычислении С и D.
При вычислении С в качестве фактических параметров при первом и втором обращениях к оператору-функции соответственно используются А, Х 2,0. и 1., Х, 8.5, которые замещают формальные параметры А, X, Z оператора-функции FNC.
Что касается аргументов, то процедуры подобны функциям Excel в следующем: существует два способа передачи аргументов в процедуру: по ссылке и по значению. При передаче аргумента по ссылке (этот метод используется по умолчанию) в процедуру передается всего лишь адрес хранения переменной в памяти. При передаче аргумента по значению в процедуру передается копия исходной переменной. Следовательно, изменение аргумента в процедуре не вызывает изменения исходной переменной.
Следующий пример (пример 3) подтверждает высказанную концепцию. Аргумент процедуры Process передается по ссылке (по умолчанию). После того, как процедура Main присваивает переменной MyValue значение 10, она вызывает процедуру Process и
141
передает MyValue в качестве аргумента. Процедура Process умножает значение своего аргумента (с названием YourValue) на 10. По окончании процедуры Process возобновляется выполнение процедуры Main, а функция MsgBox отображает MyValue: 100.
Пример 3.
Sub Main
MyValue = 10
Call Process(MyValue)
MsgBox MyValue
End Sub
Sub Process(YourValue)
YourValue = YourValue * 10 'по ссылке меняет MyValue
End Sub
Если необходимо, чтобы вызываемая процедура не изменяла переменные, полученные как аргументы, то надо изменить список аргументов вызываемой процедуры так, чтобы аргументы передавались по значению, а не по ссылке. Для этого добавьте перед аргументом ключевое слово ByVal. Тогда вызываемая процедура будет управлять копией переданных данных, а не самими данными.
В следующей процедуре, например, изменения, которые происходят с YourValue в процедуре Process, не влияют на значение переменной MyValue в процедуре Main. В результате функция
MsgBox
отображает 10, а не 100.
Пример 3. (Другой вариант)
Sub Process(ByVal YourValue)
YourValue = YourValue * 10 'по значению не меняет MyValue
142