遍历并使用通配符匹配字符串

时间:2019-08-20 16:16:06

标签: excel vba loops match

我试图遍历A列中的单元格并找到特定的文本字符串。文本字符串如下:

tag:(1001)[EX==]
tag:(1002)[EX==]
tag:(1003)[EX==]
etc...

我想这样使用通配符:

"tag:(1###)[EX??]"

其中3个###是任意3个数字,而2个是??是任何2个单个字符。

但是,我也希望[EX ??]位于这样的数组中:

ArrTagSuffix = Array("[EX??]", "[IN??]", "[EXLW]")

所以...通配符字符串看起来像这样:

"tag:(1###)" & ArrTagSuffix

此外,我希望“ tag:(1 ###)”中的“ 1”类似于“ i”,这样我就可以像这样对其进行索引:

“ tag :(”&i&“ ###)”&ArrTagSuffix

我的第一个问题是通配符的这种格式似乎不起作用。我的第二个问题围绕着试图弄清楚循环/搜索。

基本上,假设“ i”可以是1到6,并且ArrTagSuffix将具有3个不同的字符串。最终可以有18种不同的“ i”和ArrTagSuffix组合。我想搜索列A ...如果找不到匹配项...不执行任何操作...但是如果找到匹配项...将所有匹配的单元格复制到新的工作表上。但是我需要将其复制到找到的相同单元格中...所以...例如...如果在单元格A23中找到匹配项...则需要将其复制到新工作表的单元格A23中

所以...例如...如果Sheet1 ...列A具有:

Blank cell
Blank cell
tag:(1001)[EX==]
Blank cell
tag:(1002)[EX==]
tag:(1003)[EX==]
Blank cell
tag:(3001)[EX==]
tag:(3002)[EX==]
tag:(3003)[EX==]
tag:(6001)[IN==]
Blank cell
tag:(6002)[IN==]
tag:(6003)[IN==]
tag:(1001)[EXLW]
Blank cell
tag:(1002)[EXLW]
tag:(1003)[EXLW]

程序将找到4个匹配项:

"1" and an "[EX??]"
"3" and an "[EX??]"
"6" and an "[IN??]"
"1" and an "[EXLW]"

所以...它将把列A的匹配项复制到4张新纸上的相应单元格中。

最初,我有一个简单的任务,我只需要找到“标签”一词,并且我的代码可以正常工作:

With ActiveSheet
    Set criteriarange = Range("A1:A" & LShtRow)
        For Each criteriacell In criteriarange
            If Not criteriacell.Value Like "tag:*" Then
                criteriacell.ClearContents
            End If
        Next criteriacell
End With

所以我开始修改它以尝试完成此任务……但是就像我上面说的那样……我什至无法使通配符部分正常工作……更不用说循环了……这里是我的位置:

With ActiveSheet
    Set criteriarange = Range("A1:A" & LShtRow)
        For Each criteriacell In criteriarange
            If Not criteriacell.Value Like "tag:(" & i & "###)" & ArrTagSuffix Then
                criteriacell.ClearContents
            End If
        Next criteriacell
End With

我立即意识到它不知道如何处理“ i”,所以我暂时将“ i”更改为“ 1”,以查看是否有匹配项:

With ActiveSheet
    Set criteriarange = Range("A1:A" & LShtRow)
        For Each criteriacell In criteriarange
            If Not criteriacell.Value Like "tag:(" & "1" & "###)" & ArrTagSuffix Then
                criteriacell.ClearContents
            End If
        Next criteriacell
End With

但是我没有向我表明我的通配符格式不正确。为了真正简化事情,我尝试过:

With ActiveSheet
    Set criteriarange = Range("A1:A" & LShtRow)
        For Each criteriacell In criteriarange
            If Not criteriacell.Value Like "tag:(1###)" & ArrTagSuffix Then
                criteriacell.ClearContents
            End If
        Next criteriacell
End With

仍然无法正常工作,我尝试了以下方法:

With ActiveSheet
    Set criteriarange = Range("A1:A" & LShtRow)
        For Each criteriacell In criteriarange
            If Not criteriacell.Value Like "tag:(1???)" & ArrTagSuffix Then
                criteriacell.ClearContents
            End If
        Next criteriacell
End With

仍然不起作用... by也不起作用,我的意思是即使它们与我正在搜索的格式匹配,它也会清除单元格的内容。

1 个答案:

答案 0 :(得分:0)

正如我昨天评论过的,正则表达式是一个很好的工具。

首先,您需要在工具菜单中添加对Microsoft VBScript正则表达式的引用。

然后添加此代码:

Private Sub simpleRegex()
    Dim strPattern As String
    Dim regEx As New RegExp
    Dim strInput As String
    Dim Myrange As Range

    strPattern = "tag:\((\d)\d{3}\)\[(\w{2}.{2})\]"

    Set Myrange = ThisWorkbook.Sheets("Sheet1").Range("A1:A18")
    With regEx
        .Global = True
        .IgnoreCase = False
        .Pattern = strPattern
    End With

    If strPattern <> "" Then
        For Each c In Myrange
            strInput = c.Value
            If regEx.Test(strInput) Then
                Set matches = regEx.Execute(strInput)
                c.Offset(0, 1).Value = matches.Item(0).SubMatches.Item(0)
                c.Offset(0, 2).Value = matches.Item(0).SubMatches.Item(1)
            End If
        Next c
    End If
End Sub

该代码将循环通过A1:A18并查找模式,如果匹配,则将输出B列的第一位数字和C列[]之间的代码。

enter image description here

然后,如果您只想要唯一项,则使用excel函数在“数据”选项卡中删除重复项,并仅勾选B和C列。
给出:
enter image description here