2017-03-17 104 views
1

Excel 2013在這裏 - 並且試圖將單元格D中的值與單元格C中的值相匹配。讓我拉出頭髮的部分是,如果單個單詞存在於列C應該從被刪除的列D.在VBA中匹配字符串中的單個單詞

例如

Column C   Column D 
Red Hairy Hats Hairy Cowpies 

由於兩個字段包含單詞Hairy它應該被更新爲讀象這樣

Column C   Column D 
Red Hairy Hats Cowpies 

我無法發現如何在Excel VBA中對字符串比較進行通配符匹配。我有這樣的語法,它確實準確匹配,但我怎麼能做像上面我的例子中的字符串單個單詞?

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 
+0

您可以對單個單元格值使用拆分(v,「」)以從要比較的兩個單元格中的每一箇中獲取單詞數組。循環查看ColD數組中的單詞並查看它們是否存在於ColC數組中。 –

回答

1

與變長數組一個RegExp選項。

創建針對每個d串中的每個C字符串爲一個全字替換

\ 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 
+0

我喜歡使用RegExp!但是,這不是刪除值? – IcyPopTarts

+0

我急於使它工作。看起來像'C = xxx yyy'和'D = yyy zzz ttt'它不會刪除「yyy」? –

+0

它似乎像沒有那些'\ b'的魅力一樣工作。好主意,但需要一些定稿:) –

0

這不是一個完整的答案,因爲我有點生疏VBA,而不是使用instr尋找火柴,你可能有更多的成功拆分兩個字符串成陣列。

的方法將是這樣的:

  • 分裂第二陣列中使用空間
  • 每個元素
    • 測試它是否是如果它的第一陣列
    • 在兩個串是,刪除元素
  • 加入第二個數組回使用空格
  • 重複和串沖洗
0
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 
+0

這是有效的,但我需要閱讀單元格值,而不是硬編碼值...我怎麼能讀取C中的每個單元格的單元格值和D中的每個單元格的數組,並使用您的函數進行比較? – IcyPopTarts

+0

在我的示例代碼中表示爲Sub Test()的代碼中,應該有類似C = ActiveSheet.Cells(10,3).Value的代碼,其中10是行,3是列(「C」)。既然你可能循環了你的工作表,你需要用一個For ... Next循環中使用的變量替換硬核值,至少對於該行來說。 – Variatus

相關問題