加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用正则表达式强制执行单元格验证?

发布时间:2020-12-14 05:57:06 所属栏目:百科 来源:网络整理
导读:使用Excel 2010.我想只允许单元格中符合给定正则表达式模式的值.所以我创建了一个UDF模块,如下所示: Public re as RegExpPublic Function isValidRegex(rng As Range,pattern As String) As BooleanIf re Is Nothing Then Set re = New RegExpEnd Ifre.patt
使用Excel 2010.我想只允许单元格中符合给定正则表达式模式的值.所以我创建了一个UDF模块,如下所示:

Public re as RegExp

Public Function isValidRegex(rng As Range,pattern As String) As Boolean

If re Is Nothing Then
    Set re = New RegExp
End If

re.pattern = pattern

isValidRegex = re.Test(rng.value)

End Function

我创建了一个名为THIS_CELL的命名范围,以便可以将当前单元格传递给isValidRegex(),如下所示:

=INDIRECT(ADDRESS(ROW(),COLUMN()))

我使用以下公式为单元格设置了自定义验证:

=isValidRegex(THIS_CELL,"(my|regex)patt[ern]")

这会产生以下错误:

A named range you specified cannot be found.

根据this article,UDF不能用于自定义验证公式.文章中建议的解决方案(将公式放在另一个单元格中,将该单元格放入命名范围,并在自定义公式中引用该单元格)将不起作用,因为我需要能够将THIS_CELL作为参数传递给功能.

我还尝试创建一个名为isValidRegexPattern的命名区域,将其定义为= isValidRegex(THIS_CELL,“(my | regex)patt [ern]”),并将自定义公式设置为= isValidRegexPattern,但这也不起作用;在isValidRegex()中放置一个断点表明该函数甚至没有被调用.

那么,我如何使用UDF进行细胞验证?

解决方法

您似乎不愿意转移到WorksheetChange事件宏,因为您认为它不“捕获单元格的更改前状态”.这在最严格的定义中可能是正确的,但这并不意味着您无法捕获已更改的状态,撤消更改,确定更改是否有效,并且只有在满足条件时才重新应用更改.

我不打算生成一个完整的正则表达式验证函数.这只是测试输入E列的数字是否小于零或空白.如果不是,那么单元格将恢复到其预交换状态.

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Count > 1 Then Exit Sub
    If Not Intersect(Target,Columns(5)) Is Nothing Then
        If Not IsEmpty(Target) Then
            On Error GoTo Safe_Exit
            Application.EnableEvents = False
            Dim vNEW As Variant
            vNEW = Target.Value
            Application.Undo
            If bIs_It_Valid(vNEW) Then
                Target = vNEW
            Else
                ' put stuff like idiot warnings here
            End If
        End If
    End If
Safe_Exit:
    Application.EnableEvents = True
End Sub

Private Function bIs_It_Valid(val As Variant) As Boolean
    If IsNumeric(val) Then _
        bIs_It_Valid = CBool(val < 0)
    Debug.Print bIs_It_Valid
End Function

如果粘贴多个值很重要,那么可以调整Worksheet_Change以适用于一系列单元格.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读