Функции VBA и переменные - PullRequest
4 голосов
/ 08 марта 2011

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

Можно ли создавать универсальные переменные в VBA, чтобы все функции могли их использовать?

Ex:

Dim testVariable As String
Dim newVariable As String

testVariable = "A"

Function testFunction() As String
    ....
    newVariable = testVariable
End Function

На данный момент testVariable (когда он находится в функции) равен "Пусто"

Спасибо,

Джесси Смотермон

Ответы [ 5 ]

4 голосов
/ 08 марта 2011

Да, но присвоение значений должно происходить в процедурах:

Public testVariable As String
Public newVariable As String

Sub SetTestVariable()
    testVariable = "A"
End Sub

Function testFunction() As String
    ....
    newVariable = testVariable
End Function

Имейте в виду, что использование большого числа глобальных переменных обычно является плохой практикой программирования.Вы хотите ограничить область действия ваших переменных тем, где они будут использоваться.Дополнительные сведения о области действия в VBA см. В этой статье базы знаний Майкрософт: Область действия переменных в Visual Basic для приложений

2 голосов
/ 08 марта 2011

Можно ли создавать универсальные переменные в VBA, чтобы все функции могли их использовать?

Да, хотя вам необходимо объявить область действия, как указано в mwolf02. Однако , что вы не можете сделать в VBA, это заполнить их вне вызова функции или процедуры, как вы можете это сделать с VBScript.

Кроме того, если вам действительно нужны глобальные переменные, вы должны получить схему именования, которая отличает глобальные переменные от локально объявленных переменных (например, префикс их с g_). Вы можете получить этот запутанный сценарий:

Public testVariable as String

Public Sub Main()
    Call Foo()
    Call Bar()
End Sub

Public Sub Foo()
    testVariable = "Foo"
End Sub

Public Sub Bar()
    Dim testVariable As String
    testVariable = "Bar"
End Sub

Значение testVariable будет равно "Foo", хотя Bar было вызвано позже. Фактически, нет никакого способа ссылаться на глобальную переменную testVariable изнутри Bar, так как она объявила локальную переменную с тем же именем.

2 голосов
/ 08 марта 2011

Оставьте переменные вне любой подфункции / функции, чтобы они стали глобальными

1 голос
/ 08 марта 2011

В качестве альтернативы вы можете использовать глобальные константы вместо переменных .

Public Const TESTVARIABLE = "A"

Я считаю, что это лучше подходит для вашего вопроса, чем для установки значения в конкретномfunction.

Obs1 .: Глобальные константы (обычно) хранятся заглавными буквами.

Obs2 .: Вы не можете установить константу global в коде рабочего листа.Для этого используйте специальный модуль (например, global.bas).

Rgds

0 голосов
/ 08 марта 2011

Очень краткий пример:

Dim testVariable As String
Dim newVariable As String

Sub setVariable(ByVal x as string)
    testVariable = x
End Sub

Function testFunction() As String
    testFunction = testVariable
End Function

Sub test()
    Call setVariable("A")
    MsgBox testFunction()
    Call setVariable("B")
    MsgBox testFunction()
End Sub

Как упоминалось в других публикациях: глобальные переменные - плохая практика, и значение должно быть назначено внутри sub / functionsОни также должны быть определены в начале модуля.

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