匹配 VBA 中字符串中的单个单词
Match Individual Words In String In VBA
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 中进行字符串比较的通配符匹配。我有这样的语法,可以进行 Exact 匹配,但是我怎么能像上面的示例那样从字符串中提取单个单词呢?
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
这不是一个完整的答案,因为我对 VBA 有点生疏,但与其使用 instr
来寻找匹配项,将两个字符串拆分为数组可能会更成功.
流程大概是这样的:
- 使用 space
拆分两个字符串
- 对于第二个数组中的每个元素
- 测试是否在第一个数组中
- 如果是,删除该元素
- 使用 spaces
将第二个数组连接回字符串
- 重复并冲洗
带有变体数组的 RegExp 选项。
针对每个 D 字符串为每个 C 字符串创建一个模式以仅替换整个单词
\b(Red|Hairy|Hats)\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
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
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 中进行字符串比较的通配符匹配。我有这样的语法,可以进行 Exact 匹配,但是我怎么能像上面的示例那样从字符串中提取单个单词呢?
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
这不是一个完整的答案,因为我对 VBA 有点生疏,但与其使用 instr
来寻找匹配项,将两个字符串拆分为数组可能会更成功.
流程大概是这样的:
- 使用 space 拆分两个字符串
- 对于第二个数组中的每个元素
- 测试是否在第一个数组中
- 如果是,删除该元素
- 使用 spaces 将第二个数组连接回字符串
- 重复并冲洗
带有变体数组的 RegExp 选项。
针对每个 D 字符串为每个 C 字符串创建一个模式以仅替换整个单词
\b(Red|Hairy|Hats)\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
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