我有可以验证内容的 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:07
,FALSE
如果不正确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
问题看起来像
答案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 公式,然后在数据验证中使用该值。只需将颜色更改为白色即可隐藏临时值。