Excel UDF 函数未更新

Posted

技术标签:

【中文标题】Excel UDF 函数未更新【英文标题】:Excel UDF Function Not Updating 【发布时间】:2020-04-01 20:32:37 【问题描述】:

我正在尝试使我的 UDF 函数在其参考单元格更新时更新。

代码如下:

Function ConCatRange(CellBlock As Range) As String
Application.Volatile True
Dim cell As Range
Dim sbuf As String
    For Each cell In CellBlock
    On Error GoTo fred
    If Len(cell.Text) > 1 Then sbuf = sbuf & cell.Text & Chr(10)
        Next
    ConCatRange = Left(sbuf, Len(sbuf) - 1)
fred:
End Function

但是,当参考单元格为空白时,它不会显示#VALUE! - 这就是我要的。相反,它不会更新并保留上次填充单元格的数据。

谢谢!

【问题讨论】:

我假设你没有 TEXTJOIN? 除了@GarysStudent 的建议,Application.Volatile 是不必要的。每当更新引用的单元格时,UDF 都会更新;并且拥有它会迫使它不必要地重新计算。 很遗憾,我没有 textjoin。 【参考方案1】:

如果您想查看#VALUE!,只需删除On Error 语句。这将允许Left() 函数报告其失败。

【讨论】:

抛出错误不同于像内置 UDF 那样向单元格返回错误。 @HackSlash 最终结果将是相同的,因为#VALUE 将由公式返回到包含公式的单元格。 这没有达到预期的效果。除非我单击单元格并手动点击“输入”,否则该功能仍然无法自动更新。 @BobbyZullo 您是否将计算模式设置为自动【参考方案2】:

试试这个:

Function ConCatRange(CellBlock As Range) As String
Application.Volatile True
Dim cell As Range
Dim sbuf As String
    For Each cell In CellBlock
    On Error GoTo exitErr
    If Len(cell.Text) = 0 Then GoTo exitErr
    If Len(cell.Text) > 1 Then sbuf = sbuf & cell.Text & Chr(10)
        Next
    ConCatRange = Left(sbuf, Len(sbuf) - 1)
    Exit Function
exitErr:
    ConCatRange = CVErr(xlErrValue)
End Function

在循环中,检查文本长度是否为 0,如果找到,则返回 CVErr(xlErrValue) - 也称为“#VALUE!”

【讨论】:

这并没有达到预期的效果。除非我单击单元格并手动点击“输入”,否则该功能仍然无法自动更新。

以上是关于Excel UDF 函数未更新的主要内容,如果未能解决你的问题,请参考以下文章

如何根据单元格颜色获取 UDF 以在 Excel 中自动更新

listobj刷新后excel udf不更新

Excel UDF 在已关闭的工作簿中引用表以进行查找

Excel 用户定义函数未在单元格更新时调用

在 Excel 加载项中编辑数据(使用索引/匹配的 UDF)

VBA - 通过用户定义的函数更新其他单元格