Передача по ссылке и по значению

Передача аргументов из одной программы в другую осуществляется двумя способами — по ссылке (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

Наши рекомендации