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

如何在Excel VBA中清除静态变量?,vba,static,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 Private Sub assignVars() '使用此函数指定默认值 静态is

我在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
Private Sub assignVars()
'使用此函数指定默认值
静态isSet为整数
如果设置为1,则
“做点什么
isSet=1
如果结束
端接头

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

嗯。。。。把变量清除成你想要的样子怎么样?其默认值为零:

isSet = 0

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

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

但是,这将破坏所有存储状态,即所有模块级变量、所有过程中的所有静态变量等,这是突然的<代码>卸载和
终止
事件不触发等:

(我在重读你的问题后编辑了下面的内容…)

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

您没有要求这样做,但是如果您希望能够在一个过程中重置一个静态变量,而不编辑任何代码,则必须执行以下笨拙的操作:

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
公共子赋值变量(可选重置为布尔值)
静态isSet为整数
如果重置,则
isSet=0
出口接头
如果结束
如果设置为1,则
isSet=1
如果结束
端接头
请注意,我必须使您的例程
公开
,以便您可以在需要重置时从即时窗口调用它,参数为
True


如果您需要从程序外部访问某个状态,在这种情况下,为了手动重置它,您可以考虑模块级变量,而不考虑<代码>静态< /COD>过程级一级。然后你的例程就可以保持私有状态了,它的接口就不会因为重置的目的而被弄脏,你可以随意手动处理模块级变量。

嗨,我不知道是否还有人想编写自己的“搜索函数”,但我发现我想从一个单元格中收集几个单词,删除逗号,然后使用内置的“InStr”函数在字符串中搜索。无论如何,我想对所有的单词都这样做,所以每次使用InStr后,我都必须清除收集的单词。为此,我将字符串设置为空

这里有一个使用断点和即时窗口的方法

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

    Sub Sub_与_static_var()

    端接头

  • 在接头中设置断点,然后再次运行,并在断点处停止

  • 在即时窗口中输入
    N=0
    ,然后将“要运行的下一行”箭头拖动到结束子行并执行完成
  • 如果您现在运行此sub,它将打印1(即N为0,并像往常一样递增)


    这应该满足您的需求,并且不会影响您编写代码的方式。(如果您的sub有参数,您可能必须使用一些伪参数通过即时窗口调用它才能应用此方法。)

    问题是我已经运行了一次例程,因此isSet=1。然后我做了一个更改,并希望再次运行该例程,但是当我希望它为0时,却被isSet=1卡住了。也就是说,每当我启动电子表格时,我希望isSet为0,并且代码只执行一次。但是,因为我正在测试我的电子表格,所以我想要一种重置isSet的方法。这有意义吗?
    Static N As Long:     N = N + 1
    
    Debug.Print N