根据传入的实时服务器数据导致的单元变化运行macros

我想在单元格F3增加时运行波纹pipemacros。 我需要这样做,而不需要手动干预,因为由于传入的RTD服务器数据,F3正在增加。 就目前而言,除非手动更新表格中的内容,否则macros不会运行。

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中的字段。 对input的数据进行了一些计算,但是如果没有Cell I3正常工作,我不能做任何一个计算。

这可能工作,而不是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 

现在我想一个限制是,在结束会话后,保存/closures文件等, Prev_Val的值将不会持续。 有很多方法可以解决这个限制,使用隐藏的工作表来存储值,或者在工作表/工作簿或者CustomDocumentProperties存储一个Namevariables(我想我最近在这里给另一个Q写了一个关于如何使用CustomDocumentProperties的答案,而且我确定我也有一些关于使用Names这种方法,…)。

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

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

虽然我没有真正testing过,但它可能不适合你,所以最好使用CustomDocumentProperties ,下面是一个例子:

VBA中公共variables的替代方法

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

希望这可以帮助!