【问题标题】:Function to get the maximum value of a list of dynamic cells?获取动态单元格列表最大值的函数?
【发布时间】:2021-06-01 15:19:52
【问题描述】:

我有一个 B 列的 excel 表,其中包含超过 100 行,这些行是来自 RTD 链接的动态。

此 RTD 链接每秒更新一次,并且值不断增加,直到在给定时刻它变为零。我只需要在 C 列存储它变为零之前的最后一个值。

我尝试通过 sub(下面的代码),但我创建的循环导致 Excel 崩溃。

我认为最好的方法是使用 VBA 函数,我尝试过但没有成功。有人可以在函数中思考吗?

Private Sub Worksheet_Calculate()
Dim rng As Range
Set rng = Me.Range("B3:B7")

For i = 3 To 7

    If Range("B" & i) > Range("C" & i) Then
        Range("C" & i) = Range("B" & i)
    End If

Next i

End Sub

【问题讨论】:

  • 和昨天一样的问题?看起来很熟悉...您的 Excel 可能崩溃了,因为您正在修改计算事件中的数据,这会触发重新计算等。见stackoverflow.com/questions/13860894/…
  • 它们是在同一秒内全部降为 0 还是在另一个时间降为每个值?降到 0 之前的最后一个值是最大值吗?
  • @funthomas,类似于我昨天发布的问题。我是按子制作的,但我认为按功能会更好。我只能通过计算事件触发,更改事件不是由 RTD 更新触发
  • @peh,每个值在不同的时刻归零。是的,零之前的最后一个值是最大值
  • 我了解到您不能使用 Change 事件。但问题与给定链接中的问题相同:在触发器内操作工作表数据时停用事件 (Application.EnableEvents = False)

标签: excel vba function


【解决方案1】:

想象以下 UDF(用户定义函数)。它有一个循环引用,可能 Excel 会抱怨它可能计算错误(但如果您在该抱怨处单击 OK,它仍然有效)。

Option Explicit

Public Function RTD_Max(ByVal Value As Variant)
    If Not Value = 0 Then
        RTD_Max = Value
    Else
        RTD_Max = Application.ThisCell.Value
    End If
End Function

下面的蓝色单元格已将公式=RTD_Max(B3) 复制下来。

正如您所看到的,当数据进入时,它会在下降到 0 之前保留 C 中 B 的最后一个值。


题外话: 由于没有可用的 RTD,因此我使用以下代码对传入数据进行动画处理:

Public Sub Animate()
    Dim i As Long
    For i = 1 To 10
        Dim Cell As Range
        For Each Cell In Range("B3:B7").Cells
            Cell.Value = Cell.Value + Rnd
        Next Cell
        Application.Wait (Now + TimeValue("0:00:01"))
    Next i

    For Each Cell In Range("B3:B7").Cells
        Cell.Value = 0
    Next Cell
End Sub

【讨论】:

  • @peh,很好!工作......但正如你所说,当值变为零时,excel会抱怨,因为循环引用。你知道我是否可以通过一些代码行来避免这个 msgbox?
  • @TiagoDelazari 不,对不起。不知道。也许别人有。或者试试 FunThomas 建议的方法,我猜也可以。
猜你喜欢
  • 1970-01-01
  • 2018-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-10
  • 1970-01-01
相关资源
最近更新 更多