excel vba中的公共静态变量

时间:2014-02-16 02:14:46

标签: excel vba global-variables public shared

是否可以在一个过程中声明一个静态变量,并使用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”。

感谢您的帮助

宙斯

3 个答案:

答案 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