Передача аргументов по ссылке и по значению

 

Существуют два способа, которыми VBA передает информацию в функцию-процедуру: по ссылке и по значению.

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

При передаче аргумента по значению VBA создает копию исходных данных и передает эту копию функции. Если функция изменяет значение в аргументе, передаваемом по значению, изменяется только копия данных; исходные данные не изменяются. Передача по ссылке позволяет с помощью функции изменять исходные данные, передаваемые функции посредством аргумента; передача же по значению не позволяет изменять значение исходных данных.

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

 

Пример 3

 

Function Sconcat(argl As String, arg2 As String) As String

argl = Trim(argl)

arg2 = Trim(arg2)

Sconcat = argl & arg2

End Function

 

Sub Test_Sconcat()

Dim a1 As String

Dim a2 As String

a1 = " Значение a1:"

a2 = " Значение a2:"

MsgBox a1 & a2, , "До вызова Sconcat"

MsgBox Sconcat(a1, a2), , "При вызове Sconcat"

MsgBox a1 & a2, , "После вызова Sconcat"

End Sub