Excel每200ms计算一次增值

时间:2016-11-01 22:06:12

标签: excel excel-vba excel-formula worksheet vba

我有这个工作表从API获取数据,每200毫秒刷新一次。我想计算每200毫秒不断增加的值变化。例如,单元格B2在200毫秒后的值为4,然后变为7然后变为16然后变为26等,它只是不断向其中添加值。我想要的是从最新值中减去旧值以获得更改,例如7-4 = 3或16-7 = 9或26-16 = 10.

我添加了一张图片以便澄清。这显示了我如何从软件中获取数据。 worksheet http://i64.tinypic.com/2uny5w2.png

还有一张图片:

worksheet http://i66.tinypic.com/2ppajvn.jpg

2 个答案:

答案 0 :(得分:1)

首先,通过转到File - >在Excel中启用迭代计算;选项 - >然后选中公式,然后选中"启用迭代计算"。

旁边的框

您需要定义以下单元格:

cell B1     0 (set to 1 to reset)
cell B2     =IF($B$1 = 1,, $B$2 + 1)

使用以下公式并从B9中填写您想要查看的更多更改(此公式假设您将最大迭代次数设置为100):

cell B9 =IF($B$1 = 1,"", IF($B$2 / 100 = $A9, $B$5, 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

答案 1 :(得分:0)

我建议基于工作表更改事件处理的VBA解决方案。打开 VBA项目,并将以下代码放入 Microsoft Excel对象部分中的目标工作表中:

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中设置缓冲区的大小,如果您不想使用缓冲区,则只需离开{ {1}}大小,e。 G。对于您的情况,0的值将计算最后一个值与延迟800毫秒之间的差值。

<强>更新

评论中提供了稍微简化的代码版本,将以下代码放入目标工作表中:

3