每当单元格F3增加时,我想运行波纹管宏。我需要在没有人工干预的情况下实现这一点,因为F3由于传入的RTD服务器数据而增加。按照目前的情况,除非我手动更新工作表中的内容,否则宏不会运行。
Public Prev_Val As Long
Private Sub Worksheet_Change(ByVal Target As Range)
'using a Public variable to store the previous value
If Range("F3") <> Prev_Val Then
Application.EnableEvents = False
Range("I3") = Range("F3") - Prev_Val
Prev_Val = Range("F3")
Application.EnableEvents = True
End If
End Sub
我尝试过使用:
If Target.Address = "$F$3" Then
'code here
但这似乎不起作用。
背景信息:我使用RTD和库存模拟器自动填充Excel中的字段。对传入的数据进行了几次计算,但是如果没有Cell I3正常工作,我就无法做任何一次!
答案 0 :(得分:1)
这可能有效,而不是Worksheet_Change
事件,请使用Worksheet_Calculate
事件。每次工作表计算时都会运行此过程,因此您需要启用自动计算(这是正常的默认设置)。
这基本上是你的确切代码,略有调整:
Public Prev_Val As Long
Private Sub Worksheet_Calculate()
Dim rngF3 As Range
Set rngF3 = Range("F3")
If rngF3 <> Prev_Val Then
Application.EnableEvents = False
Range("I3") = rngF3 - Prev_Val
Prev_Val = rngF3
Application.EnableEvents = True
End If
End Sub
现在我认为一个限制是,在您结束会话,保存/关闭文件等之后,Prev_Val
的值将不会持续存在。您可以通过多种方法解决此限制,使用隐藏工作表来存储值,或者在工作表/工作簿中使用Name
变量,或CustomDocumentProperties
(我想我最近在这里写了一个答案)关于如何使用CustomDocumentProperties
的另一个问题,我确信我也有一些关于使用Names
进行此类方法的问题......)。
但也许最简单的方法是在Worksheet_Activate
事件
Private Sub Worksheet_Activate()
If Prev_Val = 0 Then Prev_Val = [F3]
End Sub
我还没有真正测试过这么彻底,但它可能不适合你,所以最好使用CustomDocumentProperties
,这是一个例子:
Alternatives to Public Variables in VBA
其他几种可能的方法也在Q中作为答案发布。
希望这有帮助!