Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 如何在事件内部创建计数器?_Vba_Excel_Events_Excel 2013 - Fatal编程技术网

Vba 如何在事件内部创建计数器?

Vba 如何在事件内部创建计数器?,vba,excel,events,excel-2013,Vba,Excel,Events,Excel 2013,在单元格A1中,我有一个公式,每一到两秒钟自动重新计算一次。当此单元格重新计算时,A1中的旧值将复制到单元格B1。每次它重新计算,我只想得到一个运行总数。到目前为止,当A1发生变化时,有效的方法是将旧值复制到B1,但无法在每次这样做时获得运行总数。问题是i始终等于1。有什么想法吗 Private Sub Worksheet_Calculate() Dim dProfit As Double Dim i As Integer dProfit = Me.Range("A1"

在单元格A1中,我有一个公式,每一到两秒钟自动重新计算一次。当此单元格重新计算时,A1中的旧值将复制到单元格B1。每次它重新计算,我只想得到一个运行总数。到目前为止,当A1发生变化时,有效的方法是将旧值复制到B1,但无法在每次这样做时获得运行总数。问题是
i
始终等于1。有什么想法吗

Private Sub Worksheet_Calculate()
    Dim dProfit As Double
    Dim i As Integer

    dProfit = Me.Range("A1").Value
    Application.EnableEvents = False

    If dProfit >= 1 Then
        i = i + 1
        MsgBox "calculation detected is " & dProfit & " i= " & i
        Range("$B1") = dProfit
        Application.EnableEvents = True
    End If
End Sub

尝试在您的sub之外声明
i

Dim i As Integer

Private Sub Worksheet_Calculate()
' Rest of your code here
End Sub
这样,变量
i
将在子节点终止后保持不变。
只要VBA不停止或遇到错误,它就会持续存在。

或者将其保持为本地变量,但将其声明为
静态变量,以便在方法调用之间记住其值

Static i As Integer
请注意,当
i
达到32768时,您的代码将爆炸,因为
整数
存储超过16位-如果出现问题,可以将其声明为
(32位)


更好的解决方案是将
i
保留为局部变量,而不使其成为
Static
——我不喜欢
Static
变量;)


为此,您可以从工作表上的单元格中检索值,增加值,然后将递增的值存储在下一次迭代将读取它的位置。

您需要将计数器变量声明为公共/全局变量,以便即使退出实际使用计数器的事件,该值仍然存在

代码的问题在于它是在事件内部声明的,因此它的作用域是本地的——这意味着它在事件被触发时被初始化,一旦控件离开事件/函数,它就会从内存中删除


要了解有关局部/全局变量的更多信息,请参阅

Sure,除了全局变量之外。。。它可以在模块级别确定范围,而不必公开。变量应该总是在所需的最小范围内声明。。但我想我没有提到在任何地方使用“Public”限定词。我指的是变量的范围。当您将其从事件中取出并在模块中声明时,它对于该模块是全局的,而不管您使用私有或公共限定符。不过,“Static”是一个很好的选项,它只在该事件中使用。嗨,Saagar,谢谢你让我了解局部/全局变量。有很多我不知道,但我喜欢学习。谢谢你的链接!感谢L42的快速回复。它起作用了!非常感谢。谢谢你。你的解决方案奏效了。。。。非常感谢。。。你会推荐一些好的VBA书籍给新手学习吗?“对于傻瓜”书籍通常很容易阅读,但你可以通过浏览了解很多-至于推荐,我有一点既得利益,但我建议你看看-这是我正在做的一个小项目,它增加了代码检查等功能,单元测试和重构到VBA编辑器。感谢Mat提供的链接。我会调查的。