如何在活动中创建一个计数器?

时间:2015-03-27 02:13:26

标签: excel vba excel-vba events excel-2013

在Cell 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

3 个答案:

答案 0 :(得分:5)

尝试在子网外声明i

Dim i As Integer

Private Sub Worksheet_Calculate()
' Rest of your code here
End Sub

这种方式变量i将在子终止后继续存在 只要VBA不停止或遇到错误,它就会持续存在。

答案 1 :(得分:3)

要么declare i outside the procedure,要么将其保持为本地但是将其声明为Static变量,以便在方法调用之间记住它的值。

Static i As Integer

请注意,当i达到32,768时,您的代码将会爆炸,因为Integer存储在16位以上 - 如果是{&#39},则可能将其声明为Long(32位)。一个问题。


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

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

答案 2 :(得分:1)

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

你的代码的问题是它在事件中被声明,因此它的范围是Local - 意味着它在事件被触发时被初始化,并且一旦控件离开事件/函数就被从内存中删除。

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