微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

excel 2016 vba 非易失性用户定义函数重新计算意外

如何解决excel 2016 vba 非易失性用户定义函数重新计算意外

我正在一个工作簿中的两个工作表上处理两个结构化表格。

我在 SheetA 中使用我的 UDF,它将 3 个参数作为字符串。

一个参数是 ID 列,第二个参数是其列标题单元格的前 8 个字符,第三个参数是其列标题单元格的最后 8 个字符。

UDF 应用于许多其他类似的单元格。这些列将随着时间的推移而扩展。 ID 和标题单元格都是静态值。它们不是来自其他细胞。

UDF 将通过“Application.Match”搜索 TableB 并从匹配的行和列中提取值。如果一切都有效,它将返回适当的结果。

表A:表A

ID 04/07/21 - 10/07/21 11/07/21 - 17/07/21
123456 =UDF(TableA:[@[ID]:[ID]],LEFT(T​​ableA[[#Headers],[04/07/21 - 10/07/21]],8),Right(TableA[ [#Headers],8)) =UDF(TableA:[@[ID]:[ID]],[11/07/21 - 17/07/21,Right(TableA[[#]标题],[11/07/21 - 17/07/21]],8))
AABBCC =UDF(TableA:[@[ID]:[ID]],8))

表B:表B

日期 123456 AABBCC
04/07/21 5.0 --
05/07/21 -- 7.5
06/07/21 -- 7.5
07/07/21 8 --
08/07/21 -- --
09/07/21 -- --
10/07/21 -- --
11/07/21 -- --

我的问题是,每当我编辑表(即 volatile)时,我的 UDF 都会导致耗时的计算,即使我没有编辑这三个参数/相关单元格。此外,每当我折叠/展开分组表列时,UDF 都会重新计算。我想让 UDF 仅重新计算(当其中一个参数发生变化时)或(如果“SumRange”中的值发生变化)。当匹配范围更新时,结果应该有点像索引/匹配公式。

这里显示了 UDF:

Function UDF(ID As String,Date1 As String,Date2 As String) As Variant
    TargetTable = "TableB"
    Set WS1 = ThisWorkbook.Worksheets("SheetB")

    With WS1
        matchCol = Application.Match(ID,.ListObjects(TargetTable).HeaderRowRange,0)
        If IsError(matchCol) Then
            UDF = "ID not found"
            Exit Function
        End If
        
        matchRow1 = Application.Match(CLng(CDate(Date1)),.ListObjects(TargetTable).ListColumns("Date").Range,0)
        matchRow2 = Application.Match(CLng(CDate(Date2)),0)
        
        Set SumRange = .Range(.Cells(matchRow1,matchCol),.Cells(matchRow2,matchCol))
        
        Arr = SumRange.Value
        For Each cel In Arr
            If Len(Trim(cel)) > 0 Then
                UDF = Application.Sum(SumRange)
                Exit Function
            End If
        Next cel
    End With
    
    UDF = ""
End Function

解决方法

我无法重复您的问题。

如果我更改 TableB 中的值,UDF 不会重新计算(因为它不是易失性的,并且 UDF 参数列表中的任何内容都没有更改)。 如果我更改表 A 中的某些内容,UDF 将重新计算,因为它的所有字段都是公式或由 UDF 引用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。