1

每当单元格 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 正常工作,我无法进行任何计算!

4

1 回答 1

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(我想我最近在这里写了一个关于如何使用的 Q 的答案CustomDocumentProperties,我'我确定我也有一些关于使用Names这种方法的方法......)。

但也许最简单的方法是在事件中做这样的Worksheet_Activate事情

Private Sub Worksheet_Activate()
    If Prev_Val = 0 Then Prev_Val = [F3]
End Sub

不过,我还没有真正彻底地测试过,它可能不适合你,所以使用 可能会更好CustomDocumentProperties,这里有一个例子:

VBA 中公共变量的替代方案

其他几种可能的方法也作为答案发布在 Q 中。

希望这可以帮助!

于 2014-06-04T03:49:11.187 回答