在VBA中匹配单个string

Excel 2013在这里 – 并试图将单元格D中的值与单元格C中的值匹配。让我拉出头发的部分是这样一个事实,即如果C列中存在单个单词,则应从列中删除D.

例如

Column C Column D Red Hairy Hats Hairy Cowpies 

由于这两个字段都包含Hairy这个词,所以应该更新为像这样读取

 Column C Column D Red Hairy Hats Cowpies 

我无法发现如何在Excel VBA中进行string比较的通配符匹配。 我有一个完全匹配的语法,但是我怎么能像上面的例子那样从string中单个单词呢?

 Dim i As Long Dim resArry dataArry = Cells(1).CurrentRegion ReDim resArry(UBound(dataArry, 1) - 1, 1) For i = 2 To UBound(dataArry, 1) If InStr(1, dataArry(i, 3), dataArry(i, 4), vbBinaryCompare) Then resArry(i - 2, 0) = "" Else resArry(i - 2, 0) = dataArry(i, 4) End If Next Range("D2").Resize(UBound(resArry, 1)) = resArry 

具有变体数组的RegExp选项。

针对每个Dstring为每个Cstring创build一个模式,仅用于整个字词replace

\ B(红|毛|帽子)\ b

等等

 Sub Interesting() Dim rng1 As Range Dim X, Y Dim lngCnt As Long Dim ObjRegex As Object Set rng1 = Range([c1], Cells(Rows.Count, "c").End(xlUp)) X = rng1.Value2 Y = rng1.Offset(0, 1).Value2 Set ObjRegex = CreateObject("vbscript.regexp") With ObjRegex .Global = True For lngCnt = 1 To UBound(X, 1) .Pattern = "\b(" & Join(Split(X(lngCnt, 1), Chr(32)), "|") & ")\b" Y(lngCnt, 1) = .Replace(Y(lngCnt, 1), vbNullString) Next End With rng1.Offset(0, 1).Value2 = Y End Sub 

这不是一个完整的答案,因为我对VBA有些生疏,而不是使用instr来寻找匹配,你可能会更多的成功将两个string分割成数组。

这个过程是这样的:

  • 使用空格分割两个string
  • 为第二个数组中的每个元素
    • testing它是否在第一个数组中
    • 如果是,请删除元素
  • 使用空格将第二个数组加回到一个string中
  • 重复和冲洗
 Private Sub Test() Dim C As String, D As String C = "Red Hairy Hats" D = "hairy cowpies" Debug.Print RemoveMatches(C, D) End Sub Private Function RemoveMatches(C As String, D As String) As String Dim Sp() As String Dim i As Integer Sp = Split(C) For i = 0 To UBound(Sp) If InStr(1, D, Sp(i), vbTextCompare) Then D = Trim(Replace(D, Sp(i), "", Compare:=vbTextCompare)) End If Next i RemoveMatches = D End Function