Regex VBA如何对单元格中的用户输入使用正则表达式

Regex VBA如何对单元格中的用户输入使用正则表达式,regex,vba,Regex,Vba,我试图用正则表达式在单元格中指定用户输入。其思想是仅使用以下字符串: C1, C2, C3, C4, C5, C6, C7, C8, C9, C10 后跟空格,然后合并或完成边框或宽度,最后后跟空格,然后是1到100之间的整数 比如说 C4合并1,C5宽度2,C7完整框架。完整框架后不得有整数,每3个组合必须用逗号分隔 到目前为止,我只知道如何使用特定的词语,这就是表达: ^(?!\s*$)(?:合并|完整框架|宽度)+$。这是我的工作单。目前,我只需要在G列中执行此操作: C6,merge

我试图用正则表达式在单元格中指定用户输入。其思想是仅使用以下字符串:

C1, C2, C3, C4, C5, C6, C7, C8, C9, C10
后跟空格,然后合并或完成边框或宽度,最后后跟空格,然后是1到100之间的整数

比如说 C4合并1,C5宽度2,C7完整框架。完整框架后不得有整数,每3个组合必须用逗号分隔

到目前为止,我只知道如何使用特定的词语,这就是表达: ^(?!\s*$)(?:合并|完整框架|宽度)+$。这是我的工作单。目前,我只需要在G列中执行此操作:

 C6,merge,1,  C10,merge,1, C8,merge,1, C9,merge,1, C1,complete framed,1, C6,merge,1, C2,complete framed,1, C5,complete framed,1, C8,merge,1, C1,complete framed,1, C5,merge,1, C5,merge,1, C8,merge,1, C9,merge,1, C7,merge,1, C2,complete framed,1, C6,merge,1, C1,complete framed,1
C5,merge,1, C8,merge,1, C7,merge,1, C9,merge,1, C6,merge,2, C1,complete framed,2, C7,merge,1, C6,merge,1, C8,merge,1, C6,width,1, C8,width,1
C6,merge,1, C4,merge,1 .     
现在的区别是在“完整框架”之后不能有整数

 Sub by_blocks_regex()


 Dim strPattern As String: strPattern = "\b(C(?:10|[1-9])),(merge|complete framed|width),(\d+)"
 Dim strReplace As String: strReplace = ""
 Dim regEx As New RegExp
 Dim strInput As String
 Dim strOutput As String
 Dim Myrange As Range
 Dim currMatch As match

 Dim cell As Range
 Set Myrange = ThisWorkbook.Worksheets("BY Blocks").Range("G3:G19")
 Dim currCell As Range

 For Each currCell In Myrange
     If strPattern <> vbNullString Then
         strInput = currCell.Value
     End If
         With regEx
         .Global = True
         .MultiLine = True
         .IgnoreCase = False
         .Pattern = strPattern

     If regEx.Test(strInput) Then
     strOutput = regEx.Replace(strInput, strPattern)
                    'MsgBox ("A cell match with the pattern:   ") &  currCell
                'Else
                   'MsgBox ("No cell match with the pattern:   ") & strPattern
                End If
   End With
   Next currCell
   End Sub
Sub by_blocks_regex()
作为字符串的Dim strPattern:strPattern=“\b(C(?:10 |[1-9]),(merge | complete framed | width),(\d+)
将strReplace设置为字符串:strReplace=“”
Dim regEx作为新的RegExp
像弦一样的模糊的条纹
作为字符串的暗输出
将Myrange变暗为Range
以火柴为火柴
暗淡单元格作为范围
设置Myrange=ThisWorkbook.Worksheets(“按块”).Range(“G3:G19”)
Dim Curr单元格作为范围
对于Myrange中的每个单元格
如果strPattern vbNullString,则
strInput=currCell.Value
如果结束
用正则表达式
.Global=True
.MultiLine=True
.IgnoreCase=False
.Pattern=strPattern
如果正则表达式测试(strInput),则
strOutput=regEx.Replace(strInput,strPattern)
'MsgBox(“与模式匹配的单元格:)&currCell
”“否则呢
'MsgBox(“没有与模式匹配的单元格:)&strPattern
如果结束
以
下一个电池
端接头

我测试了正则表达式,它找到了单元格中的每个字符串,但我不知道如何在单元格输入中使用strPattern并分离每个子字符串,以便只允许C5宽度1、C4合并2等有效值。也许必须使用regex-IsMatch方法。当用户在单元格中键入某些数据以查找每个允许的匹配项并验证输入数据时。有人知道应该如何做吗?

当您更新单元格时,此代码将检查每组三个组合。将代码粘贴到工作表而不是模块中。它假定您的文本遵循以下规则:

每3个组合必须用逗号分隔


例如,字符串
C6 merge 1、C4 merge 1
将选中
C6 merge 1
C4 merge 1
。它忽略逗号和前导/尾随空格

注意:我没有检查RegExp模式,因为这不是我的强项,但在G列中输入数据时它会进行检查。是否可以发布一个单独的问题以获得正确的RegExp语法

您可能希望创建带有工作表作用域的
RegEx
变量,该工作表作用域在工作表激活时初始化,在离开工作表时销毁(省去每次更新单元格时都要这样做)


不太清楚,您是否正在尝试根据列出的要求验证单元格值?您说在
完成框显后不能有整数,但在屏幕截图中此字符串后面有数字。最后的结果应该是什么?你能不能在问题正文中添加列文本而不是图片?对不起,如果文章格式不正确,很难帮助你。请检查问题和屏幕截图中的文字:换行符不同,并且在图片中缺少逗号的文字版本中有逗号。它不能按原样工作,您应该添加一些逻辑。一旦您被此模式实现卡住,请发布代码。C6 merge 1,C4 merge 1但我可以问您是否检查正则表达式模式,这是否更适合此解决方案,因为我还想验证单元格输入以仅匹配此模式-因此只有单元格必须包含从C1到C10的值,上面的字在模式和整数之间从1到100。我检查了模式,它是OK的,在这种情况下,当我们有一个匹配,因为我尝试了很多输入,每次我得到“不匹配”,我不能让模式工作。我已经尝试了
^(?!\s*$)(?:merge | complete framed | width)+$
正如您最初编写的那样,我尝试了
\b(C(?:10 |[1-9]),(merge | complete framed | width),(\d+)
,它们都没有返回与
C4 merge 1
C5 width 2
C9 complete framed
匹配的代码。正如我在回答中所说,我没有检查RegExp模式,因为这不是我的强项-我可以说,它没有找到您建议作为示例的模式。好吧,也许语法是错误的,我问了另一个问题。谢谢是的,我在理解你的解释时遇到了困难,当然没有,但很明显你没有,但很明显你离你需要的还很远。并在组之间插入空格,除非组2是完整的框架,否则将忽略第三个组值。。不知道那是什么意思。您的链接有以下示例:
C6,merge,1,C10,merge,1,C8,merge,1
,但是组中的单词之间不应该有逗号。这个问题开始让人难受了——我想我会回避它。
Private Sub Worksheet_Change(ByVal Target As Range)

    Dim strPattern As String
    Dim regEx As RegExp
    Dim vValues As Variant
    Dim vValue As Variant

    If Not Intersect(Target, Range("G:G")) Is Nothing Then
        strPattern = "\b(C(?:10|[1-9])),(merge|complete framed|width),(\d+)"
        Set regEx = New RegExp

        vValues = Split(Target, ",")

        With regEx
            For Each vValue In vValues
                '.Global = True 'Not needed as possible matches are passed one at a time using Split.
                '.MultiLine = True
                .IgnoreCase = False
                .Pattern = strPattern

                If .Test(Trim(vValue)) Then
                    MsgBox "Match found in " & Target.Value & " : " & Trim(vValue)
                Else
                    MsgBox "No match"
                End If
            Next vValue
        End With
    End If  

    Set regEx = Nothing

End Sub