根据传入的实时服务器数据导致的单元变化运行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
存储一个Name
variables(我想我最近在这里给另一个Q写了一个关于如何使用CustomDocumentProperties
的答案,而且我确定我也有一些关于使用Names
这种方法,…)。
但也许最简单的是在Worksheet_Activate
事件中做这样的事情
Private Sub Worksheet_Activate() If Prev_Val = 0 Then Prev_Val = [F3] End Sub
虽然我没有真正testing过,但它可能不适合你,所以最好使用CustomDocumentProperties
,下面是一个例子:
VBA中公共variables的替代方法
其他几种可能的方法也作为答案张贴在Q中。
希望这可以帮助!