我有这个工作表,它从API获取数据,它每200毫秒刷新一次。我想计算一下价值的变化,它每200毫秒就会不断增加。例如,细胞B2的值在200 ms后为4,它变化到7,然后变成16,然后变成26等等,它只是不断地增加它的价值。我只想从最近的值中减去旧值,得到变化,例如7-4=3或16-7=9或26-16=10。
我增加了一幅图像以求澄清。这显示了我是如何从软件中获取数据的。
还有一张图片:
发布于 2016-11-10 10:26:26
我建议基于工作表更改事件处理的VBA解决方案。打开VBA 并将以下代码放入Microsoft对象部分的目标工作表中:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
' add reference to Microsoft Scripting Runtime via Menu - Tools - References
Const Scope = "C2:C5" ' monitoring area
Const DX = 1 ' horizontal result offset
Const DY = 0 ' vertical result offset
Const Buf = 0 ' FIFO buffer size
Static oData(0 To Buf) As New Dictionary
Static oIndex As New Dictionary
Dim rCells As Range
Dim oCell
Dim i As Long
Set rCells = Application.Intersect(Target, Target.Parent.Range(Scope))
If Not rCells Is Nothing Then
For Each oCell In rCells
With oCell
i = oIndex(.Address)
.Offset(DY, DX).Value = .Value - oData(i)(.Address)
oData(i)(.Address) = .Value
i = i + 1
If i > Buf Then i = 0
oIndex(.Address) = i
End With
Next
End If
End Sub
我为常量添加了一些注释。设置要在Scope
中监视的更改范围、结果增量将在DX
和DY
中输出的偏移量,以及算法支持的额外好处是,算法不仅支持计算增量,而且还支持通过组织为字典数组的缓冲区计算每个目标单元格之间的任意数目的帧之间的差值,因此,如果不想使用缓冲区,则只需保留0
大小,例如,3
的值将计算最后值与延迟800 ms之间的增量。
更新
根据注释中的要求,代码有稍微简化的版本,将以下代码放入目标工作表中:
Private Sub Worksheet_Change(ByVal Target As Range)
Const Scope = "C2:C5" ' monitoring area
Static oData As New Dictionary
Dim rCells As Range
Dim oCell
Dim dDelta
Set rCells = Application.Intersect(Target, Target.Parent.Range(Scope))
If Not rCells Is Nothing Then
For Each oCell In rCells
With oCell
dDelta = .Value - oData(.Address)
If dDelta <> 0 Then
.Offset(0, 1).Value = dDelta
oData(.Address) = .Value
End If
End With
Next
End If
End Sub
https://stackoverflow.com/questions/40369384
复制相似问题