Это довольно простой материал, но если вы не знаете, что искать, может быть трудно понять, как найти информацию.Это должно начать вас.
Вы не «вызываете» переменные, вы «вызываете» процедуры.Переменная, объявленная с ключевым словом Dim
внутри области действия процедуры, является локальной для той области, в которой она объявлена, поэтому нет.
Это лучше всего наблюдается с указанным Option Explicit
.
Option Explicit
Public Sub Test1()
Dim foo As Long
End Sub
Public Sub Test2()
foo = 42 ' illegal: variable is not declared / not accessible in this scope
End Sub
Понятие, которое нужно понимать здесь, это scoping .Используйте Dim
для объявления локальных переменных .Как следует из названия, такие переменные существуют только в той области, в которой они объявлены.
Далее у вас есть область действия модуля .Для этого вы можете использовать ключевое слово Dim
вне области процедуры, в верхней части модуля , но для согласованности, вероятно, лучше использовать ключевое слово Private
.
Option Explicit
Private foo As Long
Public Sub Test1()
foo = 42
End Sub
Public Sub Test2()
MsgBox foo
End Sub
Этот код будет скомпилирован, и если Test1
вызывается до Test2
, вызов Test2
вызовет 42
в окне сообщения.
Тогда у вас будет публичная область, он же "глобальный".Вы можете использовать устаревшее ключевое слово Global
для этих целей, но для согласованности лучше использовать ключевое слово Public
.
Option Explicit
Public foo As Long
Public Sub Test1()
foo = 42
End Sub
Option Explicit
Public Sub Test2()
MsgBox foo
End Sub
Вышеприведенное будет делать то же самое, что и предыдущий фрагмент, за исключениемтеперь у нас есть две процедуры в отдельных модулях ( стандартные модули - это важно).И код скомпилируется и запустится.
Правило большого пальца, вам не нужно объявлять глобальные переменные.
Переменные всегда должны быть как можно более узкими и передаваться по кругу.как параметры .Параметры могут быть переданы по значению (ByVal
) или по ссылке (ByRef
).Если не указано, ByRef
является [неудачным] значением по умолчанию.
Option Explicit
Public Sub Test()
Dim foo As Long
Assign foo
MsgBox foo
End Sub
Private Sub Assign(ByVal bar As Long)
bar = 42
End Sub
Запуск Test
вызовет окно с сообщением 0
, поскольку ByVal
передает копию иззначение (или копия указателя на ссылку на объект, когда мы говорим об объектах).
Контрастность с:
Option Explicit
Public Sub Test()
Dim foo As Long
Assign foo
MsgBox foo
End Sub
Private Sub Assign(ByRef bar As Long) ' or implicit: (bar As Long)
bar = 42
End Sub
Это появитсяокно с сообщением 42
, потому что ByRef
передает указатель на значение (или, в случае ссылки на объект, сам указатель).Обратите внимание, что это обычно не то поведение, которое вы хотите разрешить, поэтому большинство параметров следует передавать по значению.