Открытая статическая переменная в 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