Локальная переменная
Прежде всего объявите каждую переменную как можно более локальной. Например, если это необходимо только в одной процедуре / функции, объявите это там.
Локальная переменная (передается как параметр)
Если вам нужно получить доступ к переменной в более чем одной процедуре / функции, то лучше передать ее следующей функции в качестве параметра. Это можно сделать ByRef
(по умолчанию) или ByVal
.
Sub ProcedureA()
Dim ParamA As String
ParamA = "AAA"
Dim ParamB As String
ParamB = "BBB"
ProcedureB ParamA, ParamB
Debug.Print ParamA 'returns 111
Debug.Print ParamB 'returns BBB
End Sub
Sub ProcedureB(ByRef Param1 As String, ByVal Param2 As String)
Param1 = "111" 'this will change ParamA in ProcedureA too
Param2 = "222" 'this value will only be changed in ProcedureB
End Sub
При использовании ByRef
(по ссылке) можно изменить параметр в ProcedureB
и изменить его также в ProcedureA
, но параметр, который передается ByVal
(по значению), не изменяется в ProcedureA
.
Технически это не имеет никакого значения, если вы называете переменные по-разному или используете одно и то же имя. Рекомендуется использовать имя, наиболее значимое в каждой из процедур (см. Названия переменных заголовков ниже).
На самом деле, я думаю, что это также хорошая практика - всегда указывать, является ли это ByRef
или ByVal
, и не использовать значение по умолчанию. При использовании значения по умолчанию вы всегда должны помнить, что по умолчанию это ByRef
в VBA, но в VB.NET по умолчанию используется ByVal
, что может легко запутать (по крайней мере, меня).
После окончания ProcedureA
переменные больше не доступны (данные потеряны).
Глобальная переменная
Если вы хотите, чтобы данные были постоянными и доступными более чем в одной функции, используйте глобальные переменные (используйте их как можно реже).
Dim GlobalVarA As String
Sub ProcedureA()
GlobalVarA = "AAA"
End Sub
Sub ProcedureB()
Debug.Print GlobalVarA 'return AAA (if ProcedureA was run before)
End Sub
Обратите внимание, что в этом случае любая процедура может изменить значение GlobalVarA
. Если вы передадите его как параметр, как описано выше, то только переменные, которым передана переменная, могут получить доступ к переменной.
Глобальные переменные потеряют свои данные, когда Excel VBA завершится (или файл закроется).
Недостатком использования глобальных переменных в процедуре является необходимость всегда проверять ее значение, прежде чем использовать его в первый раз. Потому что, если он еще не был инициализирован, это Empty
или Nothing
. Например (выше) при запуске ProcedureB
нельзя полагаться на то, что ProcedureA
уже был запущен ранее. Поэтому вам нужно проверить значение GlobalVarA
перед его использованием в ProcedureB
, особенно если это объект, который вы должны проверить, если он не соответствует Nothing
или вы легко столкнетесь с ошибками.
Местный против Глобального
Таким образом, мы можем подвести итог, что максимальное ограничение доступа к переменной делает ваш код более безопасным и более надежным (никакая другая функция не может случайно изменить его, если он объявлен только локально). Используйте глобальные переменные только в том случае, если вам это действительно нужно.
Повторно использовать имена переменных
Повторное использование имен переменных в общем случае не проблема, если они объявлены локально. Но будет сложно, если вы используете одно и то же имя для глобальной и локальной переменных (тогда VBA предпочитает локальную!)
Dim VarA As String 'global
Sub ProcedureA()
Dim VarA As String 'same name local
VarA = "AAA" 'this uses always the local variable!
End Sub
Sub ProcedureB()
Debug.Print VarA 'this uses the global variable and it is empty (after ProcedureA is run)
End Sub
Как правило, очень полезно использовать только значимые имена переменных. Это означает, что вместо вызова переменных rng1
и rng2
вызовите их, например, InputRange
и OutputRange
. Также, если вам нужен счетчик (например, для обхода строк и столбцов), часто используются i
и j
, но он гораздо удобнее для чтения, если вы используете, например, iRow
и iCol
в качестве имен переменных.
Параметр Явный
Для принудительного определения правильной переменной я рекомендую всегда активировать Option Explicit
: в редакторе VBA перейдите на Инструменты › Параметры › Требуется переменная Декларация . Это позволяет избежать неправильного ввода имен переменных и случайно вводить новые переменные.