MS Excel 数据验证器不接受对自定义宏的调用

MS Excel 数据验证器不接受对自定义宏的调用

我有可以验证内容的 VB 宏。它接受两个字符串参数(单元格值和正则表达式)并返回 True 或 False。它CreateObject("VBscript.regexp")在内部使用。

我需要使用此宏来验证单元格。当我尝试将其设置为自定义验证器时

=Rex(E2, "\d{1,2}\:\d{2}")

其中 Rex 是我在同一个电子表格(Alt-F11 和类型)上定义的函数,而 E2 是我正在尝试验证的单元格,我收到消息“无法找到您指定的命名范围”。

如果我在同一电子表格的其他任何地方插入相同的函数(比如在顶角单元格 A1):

=Rex(E2, "\d{1,2}\:\d{2}")

它很好地向我展示了TRUE单元格 E2 是否更正了正确的值15:07FALSE如果不正确15xx- 解决了一半但实际上还没有解决。我真的需要以标准方式集成我的验证器。

我正在使用 MS Excel 2010。宏本身是

Public Function Rex(ByVal vsStringIn As String, ByVal vsPattern As String) As Boolean
    Dim objRegEx As Object
    Set objRegEx = CreateObject("VBscript.regexp")

    objRegEx.Global = True
    objRegEx.Pattern = vsPattern

    Rex = objRegEx.Test(vsStringIn)
    Set objRegEx = Nothing
End Function

问题看起来像

MS Excel 验证器问题

答案1

有趣的问题。看来 UDF 在数据验证中并不总是有效!:-(

以下替代方案:

  • 使用条件格式,并简单地突出显示任何错误的值
  • 使用普通的 Excel 公式而不是正则表达式来进行验证。对于您的情况,
    =IFERROR(IF(SEARCH(“:”,D3),AND(ISNUMBER(VALUE(LEFT(D3,SEARCH(“:”,D3)-1))),ISNUMBER(VALUE(RIGHT(D3,LEN(D3)-SEARCH(“:”,D3))))),FALSE),FALSE)
    可以完成工作。虽然不是很好,但至少功能齐全!;-)

附注:如果要检查的值是数字(具有时间格式)而不是字符串,则您的 UDF 和上述公式都将不起作用!

答案2

我知道这是一个老问题,但我不想重复这个问题。

解决方案:您可以在不同的单元格中应用 UDF 公式,然后在数据验证中使用该值。只需将颜色更改为白色即可隐藏临时值。

了解更多信息: http://support.microsoft.com/kb/160523

相关内容