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 中设置要监视的变化范围,在 DXDY 中输出结果增量的偏移量,作为奖励,算法不仅支持计算最后一个之间的增量和之前的数字,但也通过组织为字典数组的缓冲区在每个目标单元格的任意数量的帧之间,所以在 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