Excel 计算每 200 毫秒增加的值
Excel calculate increase in value every 200ms
我有这个工作表,它从 API 获取数据并且每 200 毫秒刷新一次。我想计算每 200 毫秒不断增加的值变化。例如,单元格 B2 在 200 毫秒后变为 4,然后变为 7,然后变为 16,然后变为 26,等等,它只是不断增加值。我想要的只是从最新值中减去旧值以获得更改,例如 7-4=3 或 16-7=9 或 26-16=10.
我添加了一张图片进行说明。这显示了我如何从软件中获取数据。
还有一张图片:
首先,通过转到文件 -> 选项 -> 公式,然后选中 "Enable iterative calculation" 旁边的框,在 Excel 中启用迭代计算。
您需要定义以下单元格:
cell B1 0 (set to 1 to reset)
cell B2 =IF($B = 1,, $B + 1)
使用以下公式并从 B9 向下填写您希望看到的尽可能多的更改(此公式假设您将最大迭代次数设置为 100):
cell B9 =IF($B = 1,"", IF($B / 100 = $A9, $B, B9))
我会尝试在这里展示一个例子。如果自动更新的单元格是 B5,那么当单元格刷新时,将在 B9 及以下跟踪更改。它可能不是您要找的东西,但我认为它很接近。
A B
1 reset 0
2 count 500
3
4
5 price 9
6
7
8 ID price
9 1 11
10 2 12
11 3 13
12 4 12
13 5 9
我建议 VBA 解决方案,基于工作表更改事件处理。打开 VBA Project 并将以下代码放入 Microsoft Excel Objects 部分的目标工作表中:
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
中输出结果增量的偏移量,作为奖励,算法不仅支持计算最后一个之间的增量和之前的数字,但也通过组织为字典数组的缓冲区在每个目标单元格的任意数量的帧之间,所以在 Buf
中设置缓冲区的大小,如果你不想使用缓冲区,那么就离开 0
尺寸,e。 G。 3
的值将为您的情况计算最后一个值与延迟 800 毫秒的值之间的增量。
更新
根据评论中的要求对代码进行了稍微简化的版本,将以下代码放入目标工作表中:
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
我有这个工作表,它从 API 获取数据并且每 200 毫秒刷新一次。我想计算每 200 毫秒不断增加的值变化。例如,单元格 B2 在 200 毫秒后变为 4,然后变为 7,然后变为 16,然后变为 26,等等,它只是不断增加值。我想要的只是从最新值中减去旧值以获得更改,例如 7-4=3 或 16-7=9 或 26-16=10.
我添加了一张图片进行说明。这显示了我如何从软件中获取数据。
还有一张图片:
首先,通过转到文件 -> 选项 -> 公式,然后选中 "Enable iterative calculation" 旁边的框,在 Excel 中启用迭代计算。
您需要定义以下单元格:
cell B1 0 (set to 1 to reset)
cell B2 =IF($B = 1,, $B + 1)
使用以下公式并从 B9 向下填写您希望看到的尽可能多的更改(此公式假设您将最大迭代次数设置为 100):
cell B9 =IF($B = 1,"", IF($B / 100 = $A9, $B, B9))
我会尝试在这里展示一个例子。如果自动更新的单元格是 B5,那么当单元格刷新时,将在 B9 及以下跟踪更改。它可能不是您要找的东西,但我认为它很接近。
A B
1 reset 0
2 count 500
3
4
5 price 9
6
7
8 ID price
9 1 11
10 2 12
11 3 13
12 4 12
13 5 9
我建议 VBA 解决方案,基于工作表更改事件处理。打开 VBA Project 并将以下代码放入 Microsoft Excel Objects 部分的目标工作表中:
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
中输出结果增量的偏移量,作为奖励,算法不仅支持计算最后一个之间的增量和之前的数字,但也通过组织为字典数组的缓冲区在每个目标单元格的任意数量的帧之间,所以在 Buf
中设置缓冲区的大小,如果你不想使用缓冲区,那么就离开 0
尺寸,e。 G。 3
的值将为您的情况计算最后一个值与延迟 800 毫秒的值之间的增量。
更新
根据评论中的要求对代码进行了稍微简化的版本,将以下代码放入目标工作表中:
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