如何在事件中创build一个计数器?

在单元格A1中,我有每1到2秒自动重新计算的公式。 当这个单元格重新计算时,来自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 

尝试在你的小组之外宣布i

 Dim i As Integer Private Sub Worksheet_Calculate() ' Rest of your code here End Sub 

这种方式variablesi会坚持下去之后。
只要VBA不停止或遇到错误,它将一直持续下去。

要么在程序之外声明 ,要么保留它在本地,而是声明它为一个Staticvariables,以便它的值在方法调用之间被记住。

 Static i As Integer 

请注意,当i达到32,768时,你的代码将会爆炸,因为Integer被存储在16位以上 – 如果这是一个问题,可能会声明它是一个Long (32位)。


一个更好的解决办法是保持i作为一个局部variables,而不使它Static – 我不喜欢Staticvariables;)

为了达到这个目的,你可以从工作表上的一个单元格中检索这个值,然后增加这个值,然后把增加的值存储到下一个迭代将要读取的地方。

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

你的代码的问题在于它是在事件内部声明的,所以它的作用域是本地的 – 意味着它在事件被触发时被初始化,并且一旦控制离开事件/函数就被从内存中移除。

要了解更多关于本地/全局variables的信息,请参考这个