首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Excel每200 in计算一次增值

Excel每200 in计算一次增值
EN

Stack Overflow用户
提问于 2016-11-01 22:06:11
回答 1查看 203关注 0票数 1

我有这个工作表,它从API获取数据,它每200毫秒刷新一次。我想计算一下价值的变化,它每200毫秒就会不断增加。例如,细胞B2的值在200 ms后为4,它变化到7,然后变成16,然后变成26等等,它只是不断地增加它的价值。我只想从最近的值中减去旧值,得到变化,例如7-4=3或16-7=9或26-16=10。

我增加了一幅图像以求澄清。这显示了我是如何从软件中获取数据的。

还有一张图片:

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-10 18:26:26

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

代码语言:javascript
运行
复制
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中输出的偏移量,以及算法支持的额外好处是,算法不仅支持计算增量,而且还支持通过组织为字典数组的缓冲区计算每个目标单元格之间的任意数目的帧之间的差值,因此,如果不想使用缓冲区,则只需保留0大小,例如,3的值将计算最后值与延迟800 ms之间的增量。

更新

根据注释中的要求,代码有稍微简化的版本,将以下代码放入目标工作表中:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40369384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档