是否可以在一个过程中声明一个静态变量,并使用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未被声明为静态变量,则上面的代码可以工作,但是更多代码然后变量“丢失”。如果使用静态声明,则usevar过程不会看到myvar。并且VBA不接受“Public Static myvar as integer”。
感谢您的帮助
宙斯
答案 0 :(得分:6)
通过调用 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
如果声明项目静态,则其值将保留在过程或子过程中。如果您声明项目公开,则会保留其值,并且其他程序也可以看到它。
答案 1 :(得分: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通常与全局(或模块级)变量相关联,而这在大型项目中可能是一个问题。
答案 2 :(得分:0)
关键是使用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