Передача аргументов из одной программы в другую осуществляется двумя способами — по ссылке (by reference) и по значению (by value). В первом случае передается сама переменная, поэтому ее значение в подпрограмме можно изменить. Во втором случае — только значение переменной, а не она сама, и изменить ее в вызванной подпрограмме нельзя.
Выбор способа передачи осуществляется ключевыми словами ByRef и ByVal, которые в круглых скобках указываются в описании вызываемой подпрограммы.
В Модуль5 наберите и протестируйте работу следующих программ:
1. Пример передачи переменной UserName по ссылке с одним и тем же именем переменной (подпрограмма вызывается только для одной переменной):
Sub ПередачаАргументаПоСылке ()
Dim UserName As String
UserName = "Иван"
ChangeName UserName
MsgBox UserName
End Sub
Sub ChangeName (ByRef UserName)
UserName = "Петр"
End Sub
2. Пример передачи переменной по ссылке с разными именами (одна и та же подпрограмма вызывается для разных переменных):
Sub ПередачаАргументаПоСсылке_РазныеПеременные ()
Dim UserName As String
UserName = "Иван"
ChangeName2 UserName
MsgBox UserName
End Sub
Sub ChangeName2(ByRef NewName)
NewName = "Петр"
End Sub
3. Пример передачи переменной по значению (в подпрограмму передается только её значение):
Sub ПередачаАргументаПоЗначению()
Dim UserName As String
UserName = "Иван"
ChangeName3 UserName
MsgBox "В исходной программе имя осталось прежним " _
& UserName
End Sub
Sub ChangeName3(ByVal UserName)
MsgBox "Сначала был " & UserName & "."
UserName = "Петр"
MsgBox "В вызванной подпрограмме имя стало " & UserName
End Sub
Функции
Отличие функции от подпрограммы:
§ Функция начинается ключевым словом Function и заканчивается ключевыми словами End Function.
§ Функцию можно вызывать из формулы, введенной в ячейку.
§ Функция может возвращать значение в вызывающую программу или формулу.
Рассмотрим пример функции Multiply, вычисляющей произведение двух чисел.
Sub ВызовФункции()
Dim Var1 As Integer
Dim Var2 As Integer
Dim Var3 As Integer
Var1 =5
Var2 = 10
Var3 = Multiply(Var1, Var2)
MsgBox Var3
End Sub
Function Multiply(ByVal Var1, ByVal Var2)
Multiply = Var1 * Var2
End Function
Область видимости переменных
Как вы знаете, в VBA переменные имеют три уровня видимости: процедуры, модуля, проекта (или общий уровень), которые в равной степени относятся и к одиночным переменным, и к массивам.
В Модуль5 наберите и протестируйте работу представленных ниже программ.
Переменные уровня процедуры
Следующий пример демонстрирует переменную, объявленную на уровне процедуры – любая попытка использовать переменную Var1 вне этой процедуры приведет к ошибке.
Sub ПеременныеУровняПроцедуры ()
Dim Var1 As Integer
Var1 =55
MsgBox Var1
DisplayMessage
End Sub
Sub DisplayMessage()
MsgBox Var1
End Sub
Чтобы исходное значение Varl (55) было доступно в DisplayMessage, придется либо передать его в качестве аргумента, либо расширить область видимости этой переменной.
Переменные уровня модуля
Переменную уровня модуля можно использовать в любой подпрограмме или функции того модуля, где эта переменная была определена. Чтобы сделать переменную доступной на уровне модуля, объявите её перед любыми подпрограммами и функциями, как показано в примере:
Dim Var2 As String
Sub ПеременнаяУровняМодуля()
Var2 = "Привет!"
DisplayMessage2
End Sub
Sub DisplayMessage2()
MsgBox Var2
End Sub
Переменные уровня проекта
Переменная уровня проекта (или общего уровня) доступна и сохраняет свое значение в любом модуле проекта, содержащего ее описание. Чтобы сделать переменную доступной на уровне проекта, объявите ее с ключевым словом Public перед любыми подпрограммами и функциями.
Следующие две программы напишите в разных модулях (1-ю – в Модуль2, 2-ю – в Модуль5) и протестируйте их:
Public Var3 As String
Sub ПрисвоениеЗначения()
Var3 = "Эта переменная была объявлена в Модуль2."
End Sub
Sub ПеременнаяУровняПроекта()
ПрисвоениеЗначения
MsgBox Var3
End Sub
Сохраняемые переменные
Определив переменную как Static (сохраняемую), мы продлим время ее жизни до завершения работы всех программ, включая и ту, в которой переменная была описана. Следующую программу выполните в пошаговом режиме, наблюдая за переменными Varl и Var2:
Sub СтатическаяПеременная()
СтатическаяНестатическая
СтатическаяНестатическая
End Sub
Sub СтатическаяНестатическая()
Static Var1 As String
Dim Var2 As String
If Varl = "" Then
Var1 = "Var1: Статическая переменная"
Var2 = "Var2: Нестатическая переменная "
End If
MsgBox Varl
MsgBox Var2
End Sub