根据传入的实时服务器数据导致的单元格更改运行宏

时间:2014-06-04 00:25:56

标签: excel vba finance rtd

每当单元格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正常工作,我就无法做任何一次!

1 个答案:

答案 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中作为答案发布。

希望这有帮助!