如何在Excel VBA中清除静态变量?

时间:2011-07-17 13:26:59

标签: vba static

我有一个在Sub:

中定义的静态变量
Private Sub assignVars()
' Use this function to assign default values

    Static isSet As Integer

    If isSet <> 1 Then
        ' do something

        isSet = 1
    End If

End Sub

我对代码进行了一些更改,并希望重置静态变量“isSet”。有没有简单的方法可以在不关闭Excel并再次打开它的情况下执行此操作?

4 个答案:

答案 0 :(得分:3)

最简单的方法是在即时窗口中执行End语句。

然而,这会破坏所有存储的状态 - 即所有模块级变量,所有程序中的所有静态变量等等。它是突然的; UnloadTerminate事件不会触发,等等:

http://msdn.microsoft.com/en-us/library/gg251671.aspx

(我在重新阅读你的问题之后编辑了下面的内容......)

要在一个例程中导致状态丢失,您可以手动注释掉isSet的声明,然后将其恢复。您可以在“工具...选项”菜单的“常规”选项卡下的VBE中进行设置,这将使您在发生此类状态丢失时收到通知。 (但是,它不会警告End的调用,大概是因为在这种情况下你不需要任何警告。)

你没有要求这个,但如果你想在一个程序中重置一个静态变量而不编辑任何代码,你就必须做一些像这样的kludgy :

Public Sub assignVars(Optional reset As Boolean)
    Static isSet As Integer

    If reset Then
        isSet = 0

        Exit Sub
    End If

    If isSet <> 1 Then
        isSet = 1
    End If
End Sub

请注意,我必须制作例程Public,以便您可以在需要重置时使用参数True从即时窗口调用它。

如果你需要一些可以从你的程序外部访问的状态,在这种情况下是为了能够手动重置它,你可以考虑一个模块级变量而不是Static程序级别的。然后您的例程可以保持Private,其界面不会因为重置而弄脏,并且您可以手动处理模块级变量。

答案 1 :(得分:1)

呃....如何将变量清除到你想要的变量?其默认值为零:

isSet = 0

VBA编辑器还允许您停止(“结束”)宏的执行并重新启动它(“运行”)。

答案 2 :(得分:1)

嗨我不知道是否有其他人可能想写自己的“搜索功能”,但我发现我想从一个单元格中收集几个单词,用逗号分隔,然后在字符串中搜索使用内置的“InStr”功能。无论如何,我想要为所有单词做这个,所以我必须在每次使用InStr后清除所收集的单词。为此,我将字符串设置为Empty。

答案 3 :(得分:0)

这是一种使用断点和即时窗口的方法。

  1. 编写以下例程,并运行几次以加载静态变量N。

    Sub sub_with_static_var()

    Static N As Long:     N = N + 1
    
    Debug.Print N
    

    End Sub

  2. 在Sub中设置断点,然后再次运行,在断点处停止。

  3. 在立即窗口中输入N = 0,然后将&#34;下一行拖到运行&#34;箭头到End Sub行并执行完成。
  4. 如果您现在运行此子程序,它将打印1(即N为0并且像往常一样递增)。

    这应符合您的要求,不会影响您编写代码的方式。 (如果你的sub有参数,你可能必须通过带有一些伪参数的立即窗口调用它才能应用这个方法。)