使用非默认值在VBA中初始化静态变量

Kai*_*Kai 5 vb6 static vba

VBA中的静态变量非常简单:

Public Sub foo()
    Static i As Integer
    i = i + 1
    Debug.Print i
End Sub
Run Code Online (Sandbox Code Playgroud)

输出(多次调用时):

1
2
3
...
Run Code Online (Sandbox Code Playgroud)

问题是,VBA不支持在与声明相同的行上初始化变量(不计算:在一行上放两行):

Public Sub foo()
    Dim i As Integer = 5 'won't compile!

    Dim j As Integer
    j = 5 'we have to do this instead
End Sub
Run Code Online (Sandbox Code Playgroud)

这与静态变量冲突:

Public Sub foo()
    Static i As Integer 'we can't put an initial value here...
    i = 5 'so this is how we'd usually initialize it, but...
    i = i + 1
    Debug.Print i
End Sub
Run Code Online (Sandbox Code Playgroud)

您可能会看到发生了什么 - 每次foo调用变量时所做的第一件事就是将其自身设置为5.输出:

6
6
6
...
Run Code Online (Sandbox Code Playgroud)

如何将VBA中的静态变量初始化为默认值以外的值?或者这只是VBA丢球?

Ale*_* K. 8

如果要保留静态语义而不切换到全局语法,则执行此操作的一种方法是嗅探默认值,然后设置初始条件:

Static i As Integer
if (i = 0) then i = 5
Run Code Online (Sandbox Code Playgroud)

也许是更安全的替代方案

Static i As Variant
if isempty(i) then i = 5
Run Code Online (Sandbox Code Playgroud)

要么

Public Sub foo(optional init as boolean = false)
    Static i As Integer
    if init then
      i = 5
      exit sub
    endif
Run Code Online (Sandbox Code Playgroud)

您可能还可以使用默认属性创建一个类并使用,class_initialize但这可能有点过于繁琐.

  • 很好的答案.我仔细考虑了"变种"这一点,并认为我有一个建议.另一个"静态初始化为布尔"将绕过我在问题评论中注意到的问题,而无需将类型更改为"变体".您可以使用:`如果未初始化则:i = 5:initialized = True:结束If` (2认同)