Определение способа передачи аргумента

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

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

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

Чтобы явно указать, передает VBA аргумент по значению или по ссылке, надо использовать ключевое слово ByVal (передает аргумент по значению) или ByRef (передает аргумент по ссылке) перед аргументом, для которого необходимо задать метод передачи.

Пример 4.

Function Sconcat2(ByVal argl As String, ByVal arg2 As String) As String

argl = Trim(argl)

arg2 = Trim(arg2)

Sconcat2 = argl & arg2

End Function

Sub Test_Sconcat2()

Dim a1 As String

Dim a2 As String

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

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

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

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

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

End Sub

Значения переменных а1 и а2 не изменились после вызова функции Sconcat2.

Не следует объявлять аргументы по значению (ByVal), если функция-процедура не изменяет этот аргумент, так как передача аргументов по значению может использовать больше памяти и времени для выполнения, чем передаче аргументов по ссылке – передача аргументов по значению приводит к тому, что VBA делает копию данных для аргумента.

Следует объявлять аргумент с ключевым словом ByVal для передачи его по значению, если имеются сомнения, следует ли передавать этот конкретно аргумент по ссылке или по значению: потери в объеме памяти и скорости при передаче по значению не слишком велики. Кроме того, передача аргумента по значению эффективнее и делает код более понятным, чем создание собственной копии значения аргумента в локальной переменной.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: