Открытая статическая переменная в excel vba
возможно ли иметь статическую переменную, объявленную в одной процедуре, и использовать эту переменную в нескольких разных процедурах с помощью Excel VBA?
то есть
Public myvar as integer
Sub SetVar()
static myvar as integer
myvar=999
end sub
sub Usevar()
dim newvar as integer
newvar=myvar*0.5
end sub
Мне нужно, чтобы myvar был замечен другими процедурами, а не менялся или "терялся". Код выше работает, если myvar не объявлен как статическая переменная, но больше кода, то переменная "потеряна". Если используется статическое объявление, myvar не отображается процедурой usevar. И " общественный статический myvar как целое число " не принимается VBA.
Спасибо за помощь
Зевс
3 ответов
попробуйте позвонить MAIN :
Public myvar As Integer
Sub MAIN()
Call SetVar
Call UseVar
End Sub
Sub SetVar()
myvar = 999
End Sub
Sub UseVar()
Dim newvar As Variant
newvar = myvar * 0.5
MsgBox newvar
End Sub
Если вы объявляете элемент Static, его значение будет сохранено в рамках процедуры или sub. Если вы объявите пункт общественные, его значение будет сохранено, и оно будет видно и другим процедурам.
хотя на этот вопрос ответил более четырех лет назад ученик @Gary, есть тонкий нюанс, который стоит упомянуть, так как решение может зависеть от типа данных myvar
.
прежде всего, как вы отметили в вопросе,Public Static myvar as Integer
не работает, потому что Static
разрешено только внутри процедуры или функции.
как отмечено в комментариях к OP @Patrick Lepelletier, вы можете легко обойти это, объявив (если вы не нужно менять его динамически):Public Const myvar as Integer = 999
. (Или, возможно,Private Const myvar...
)
другой вариант-объявить myvar
как функции вместо переменной или константы, превращая его в псевдо-постоянный:
Private Function myvar() as Integer
Static intMyvar as Integer
intMyvar = 999
myvar = intMyvar
End function
в этом простом примере, где myvar
является целым числом, псевдо-постоянный подход, очевидно, не нужен и добавляет накладные расходы на вызов функции. Просто объявив Constant
делает работу. Однако, используя константа работает, только если значение статическое и не является объектом. Он не будет работать, если myvar
является объектом, например Range
. В этом случае использование псевдо-констант может быть полезно:
Private Function myvar() as Range
Set myvar = Range("A1")
End Function
еще одно преимущество заключается в том, что вы можете использовать код внутри функции для проверки определенных условий и присвоения различных значений myvar
соответственно.
псевдо-постоянный подход также может быть объединен с диапазонами именования листов: если ячейка A1 является названный диапазон, скажем MyRange
, тогда вы могли бы написать:
Dim strMyString as String
strMyString = "MyRange"
Private Function myvar() as Range
Set myvar = Range(strMyString)
End Function
теперь можно перемещаться по содержимому ячейки A1, не нарушая код, так как именованный диапазон следует, Если вы вырезаете и вставляете ячейку. Я нахожу этот подход полезным на этапе проектирования, когда вещи, как правило, много перемещаются на рабочем листе.
псевдо-константы также поможет избежать проблемы обычно ассоциируется с глобальными (или на уровне модуля) переменными, которые могут быть выпуск в более крупных проектах.
ключ должен использовать 2 переменные. В ниже код, myVar есть публичных, а не статический. stvar статичен, но не публичен. Его область действия находится только в Main (). Назначая myvar=stvar и stvar=myvar, он эффективно создает переменную, которая является как общедоступной, так и статической. Значение сохраняется.
Public myvar As String
Sub Main() 'in module 1
Static stvar As String
myvar = stvar
toInput
stvar = myvar
End Sub
Sub toInput() 'in module2
myvar = InputBox("enter something", "Input", myvar)
End Sub