Эффективное передача аргументовPassing arguments efficiently

Все аргументы передаются в процедуры по ссылке, если не указано иное.All arguments are passed to procedures by reference, unless you specify otherwise. Передача аргументов по ссылке позволяет повысить эффективность, поскольку в этом случае для передачи аргумента в процедуру требуется одинаковое количество времени и памяти (4 байта) независимо от его типа данных.This is efficient because all arguments passed by reference take the same amount of time to pass and the same amount of space (4 bytes) within a procedure regardless of the argument's data type.

Чтобы передать аргумент по значению, включите в объявление процедуры ключевое слово ByVal.You can pass an argument by value if you include the ByVal keyword in the procedure's declaration. Аргументы, передаваемые по значению–, занимают от 2 16 байтов внутри процедуры, в зависимости от типа данных аргумента.Arguments passed by value consume from 2–16 bytes within the procedure, depending on the argument's data type. Передача крупных типов данных занимает немного больше времени.Larger data types take slightly longer to pass by value than smaller ones. В связи с этим не рекомендуется передавать по значению типы данных String и Variant.Because of this, String and Variant data types generally should not be passed by value.

При передаче аргумента по значению исходная переменная копируется.Passing an argument by value copies the original variable. Изменения аргумента в рамках процедуры не отражаются на исходной переменной.Changes to the argument within the procedure aren't reflected back to the original variable. Например:For example:

Function Factorial (ByVal MyVar As Integer) ' Function declaration. 
 MyVar = MyVar - 1 
 If MyVar = 0 Then 
 Factorial = 1 
 Exit Function 
 End If 
 Factorial = Factorial(MyVar) * (MyVar + 1) 
End Function 
 
' Call Factorial with a variable S. 
S = 5 
Print Factorial(S) ' Displays 120 (the factorial of 5) 
Print S ' Displays 5. 

Если в объявление функции не включено ключевое слово ByVal, предшествующий оператор Print отобразит значения 1 и 0.Without including ByVal in the function declaration, the preceding Print statements would display 1 and 0. Это связано с MyVar тем, что он будет Sссылаться на переменную, которая сокращается на 1 до тех пор, пока не будет равно 0.This is because MyVar would then refer to variable S, which is reduced by 1 until it equals 0.

Так как ByVal создает копию аргумента, он позволяет передать значение Variant функции факториала .Because ByVal makes a copy of the argument, it allows you to pass a variant to the Factorial function. Если процедура, в которой объявляется аргумент, имеет другой тип данных, передать вариант по ссылке нельзя.You can't pass a variant by reference if the procedure that declares the argument is another data type.

См. такжеSee also

Поддержка и обратная связьSupport and feedback

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи?Have questions or feedback about Office VBA or this documentation? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.