Vba 如何在事件内部创建计数器?
在单元格A1中,我有一个公式,每一到两秒钟自动重新计算一次。当此单元格重新计算时,A1中的旧值将复制到单元格B1。每次它重新计算,我只想得到一个运行总数。到目前为止,当A1发生变化时,有效的方法是将旧值复制到B1,但无法在每次这样做时获得运行总数。问题是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"
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提供的链接。我会调查的。