在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
答案 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