在Excel VBA中公共静态变量

问题描述 投票:10回答:3

是否有可能在一个过程中声明为静态变量,并使用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不为static变量声明,但后来更多的代码变量“丢失”上面的代码工作。如果使用静态声明,MYVAR不被usevar程序可见。而“公共静态MYVAR为整”不被接受的VBA。

谢谢你的帮助

宙斯

excel vba global-variables public shared
3个回答
6
投票

通过调用主要试试这个:

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

如果申报项目静态的,它的价值将程序或子之内被保留。如果申报项目公开,其价值将被保留,这将是对其它过程不可见,以及。


3
投票

虽然这个问题是在四年前回答@ Gary的学生,有一个细微差别值得一提的,因为该解决方案可以依赖于myvar的数据类型。

首先,正如您在这个问题指出,Public Static myvar as Integer不起作用,因为Static只允许一个子或函数内部。

正如评论由@Patrick Lepelletier的OP指出,可以解决这个轻松获得通过声明Constant代替(假设你没有需要动态改变它):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的内容移动而不会破坏代码,因为指定的范围内,如果你剪切和粘贴单元格依循沿着。我发现在设计阶段这个方法有用的东西的时候往往会走动了很多在工作表中。

伪常数也有助于避免通常与全球(或模块级)的变量,可能是在较大的项目的问题相关some problems


0
投票

关键是要使用2个变量。在下面的代码,MYVAR是公开的,但不是一成不变的。 stvar是静态的,但不公开。它的范围是只在主()。通过分配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
© www.soinside.com 2019 - 2024. All rights reserved.