excel用户定义函数的#value错误

Posted

技术标签:

【中文标题】excel用户定义函数的#value错误【英文标题】:#value error with excel user defined function 【发布时间】:2019-12-08 15:55:31 【问题描述】:

我在 excel VBA 中创建了用户定义函数:

Public Function RegExpReplace(Text As String, Pattern As String, replaceVar As String, Optional Glob As Boolean = False, Optional IgnoreCase As Boolean = False, Optional Multiline As Boolean = False) As Variant
On Error GoTo ErrHandl
Set regex = CreateObject("VBScript.RegExp")
regex.Pattern = Pattern
regex.Global = Glob
regex.IgnoreCase = IgnoreCase
regex.Multiline = Multiline
RegExpReplace = CVar(regex.Replace(Text, replaceVar))
MsgBox RegExpReplace
ErrHandl:
RegExpReplace = CVErr(xlErrValue)
End Function

但是当我试图从工作表中调用它时,我得到了 #VALUE! 错误:

虽然 MsgBox 显示正确的结果:

【问题讨论】:

您发布的代码对我有用。但是由于您没有发布整个代码,因此很难说出您的问题是什么。特别是没有发布错误处理代码。我猜你也运行过这段代码,虽然函数已经成功完成了。 从 VBA Sub 调用您的函数,您可以更轻松地进行调试。 @Storax 这是漏洞代码。目的是将此功能添加到excel Add-in(.xlam文件)并在工作表上使用。 如果这是整个代码,你会得到一个编译错误,你不会得到一个 MsgBox 给你显示的结果。每个函数都需要以End Function 结尾,您还需要定义标签ErrHandl。请再次仔细检查您的代码。 @Storax 谢谢,我只是忘记发布我的代码的最后 3 行 【参考方案1】:

这样修改你的代码

Public Function RegExpReplace(Text As String, Pattern As String, replaceVar As String, Optional Glob As Boolean = False, Optional IgnoreCase As Boolean = False, Optional Multiline As Boolean = False) As Variant
    On Error GoTo ErrHandl
    Set regex = CreateObject("VBScript.RegExp")
    regex.Pattern = Pattern
    regex.Global = Glob
    regex.IgnoreCase = IgnoreCase
    regex.Multiline = Multiline
    RegExpReplace = CVar(regex.Replace(Text, replaceVar))
    MsgBox RegExpReplace
    Exit Function
ErrHandl:
    RegExpReplace = CVErr(xlErrValue)
End Function

如果没有错误,您忘记退出函数,因此即使没有错误,也会执行RegExpReplace = CVErr(xlErrValue) 行给您#Value

【讨论】:

以上是关于excel用户定义函数的#value错误的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL宏如何让自定义函数返回错误代码?

Excel 用户定义函数:Nth_Occurence

VBA 用户定义函数 #VALUE 错误

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

excel表格出现#value解决方法

Excel的数据透视表中,如何过滤value中的0值?