Вызов переменных - PullRequest
       1

Вызов переменных

0 голосов
/ 05 марта 2019

Могу ли я вызывать переменные извне Public Sub, который был определен в Visual Basic?

1 Ответ

1 голос
/ 05 марта 2019

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


Вы не «вызываете» переменные, вы «вызываете» процедуры.Переменная, объявленная с ключевым словом 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 передает указатель на значение (или, в случае ссылки на объект, сам указатель).Обратите внимание, что это обычно не то поведение, которое вы хотите разрешить, поэтому большинство параметров следует передавать по значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...