2015-09-25 38 views
-1

我有兩個彼此不同的句子。請參閱下面的句子找到excel中兩個文本字段的區別

*,user,rollbacker,accountcreator 
*,user,accountcreator,rollbacker,sysop 

第一句話位於單元格A1中,第二句在單元格A2中。 正如你所看到的,第二句話有sysop這將是區別。 我想在單元格B2中顯示sysop這個詞。

我試圖TRIMSUBSTITUTE但它並沒有工作,因爲當它在第二句談到在第一句rollbacker,accountcreatoraccountcreator,rollbacker句子沒有排列方式相同。

有什麼建議嗎?

謝謝!

+0

第二個總是帶有多餘單詞的單詞,或者都會有單詞在其他單詞中找不到?這些單詞是否總是用逗號隔開? –

+0

第二句之後的下一個單元格可能有較少的單詞。這些詞總是用逗號分隔。 – user3882752

回答

2

首先將兩個字符串用逗號分隔成兩個數組,然後遍歷每個數組用空白替換任何相同的單詞。然後將兩個字符串加在一起,並將它們放在所需的單元格中。

像這樣:

Dim fArr() As String 
Dim SArr() As String 
Dim fStr As String 
Dim sStr As String 
Dim aStr As String 
Dim i As Integer, j As Integer 

fStr = Range("A1").value 
sStr = Range("A2").value 

fArr = Split(fStr, ",") 
SArr = Split(sStr, ",") 

For i = LBound(fArr) To UBound(fArr) 
    sStr = Replace(sStr, fArr(i) & ",", "") 
    sStr = Replace(sStr, fArr(i), "") 
Next i 
For j = LBound(SArr) To UBound(SArr) 
    fStr = Replace(fStr, SArr(j) & ",", "") 
    fStr = Replace(fStr, SArr(j), "") 
Next j 

If Trim(fStr) <> "" And Trim(sStr) <> "" Then 
    Range("B2") = fStr & "," & sStr 
ElseIf Trim(fStr) = "" Then 
    Range("B2") = sStr 
Else 
    Range("B2") = fStr 
End If 
+0

一個非常聰明的方法! –

+0

嗯。 OP是否希望所有的輸出都顯示在單元格B2中,不管是什麼?我採取了這樣一種方法,即B1應該顯示A1中不在A2中的任何東西...同樣,B2應顯示A2中不在A1中的任何東西。你選擇了這個答案,所以也許這就是你想要的,但是在你的問題中這並不清楚,它似乎不太有用。 –

1

我喜歡斯科特的答案,但我已經寫在平均時間這更迂方法:

Public Function CompareCSVStrings(strA As String, strB As String) As String 

Dim varA As Variant 
Dim varB As Variant 
Dim strResults As String 
Dim strTest As String 

Dim blnDifference As Boolean 

Dim intIndexA As Integer 
Dim intIndexB As Integer 

varA = Split(strA, ",", , vbTextCompare) 
varB = Split(strB, ",", , vbTextCompare) 

'Look for values in strA that are not in strB 
For intIndexA = LBound(varA) To UBound(varA) 
    vstrTest = varA(intIndexA) 
    blnDifference = True 'assume not present in second array 
    For intIndexB = LBound(varB) To UBound(varB) 
     If StrComp(varB(intIndexB), strTest, vbTextCompare) = 0 Then 
      blnDifference = False 'this string is not a difference after all 
     End If 
    Next intIndexB 
    If blnDifference Then strResults = strResults & "," & strTest 
Next intIndexA 

'Look for values in strB that are not in strA 
For intIndexB = LBound(varB) To UBound(varB) 
    strTest = varB(intIndexB) 
    blnDifference = True 'assume not present in second array 
    For intIndexA = LBound(varA) To UBound(varA) 
     If StrComp(varA(intIndexA), strTest, vbTextCompare) = 0 Then 
      blnDifference = False 'this string is not a difference after all 
     End If 
    Next intIndexA 
    If blnDifference Then strResults = strResults & "," & strTest 
Next intIndexB 

CompareCSVStrings = strResults 

End Function 
0

這是一個非常直接的方式做到這一點:

Public Sub ShowDiff() 
    [b1] = Diff([a1], [a2]) 
    [b2] = Diff([a2], [a1]) 
End Sub 
Private Function Diff(a$, b$) As String 
    Dim m&, n& 
    m = 1 
    a = "," & a & "," 
    b = "," & b & "," 
    Do 
     n = InStr(m + 1, a, ",") 
     If n Then If InStr(b, Mid$(a, m, n - m + 1)) = 0 Then Diff = Diff & "," & Mid$(a, m + 1, n - m - 1) 
     m = n 
    Loop Until n = 0 
    Diff = Mid$(Diff, 2) 
End Function 
0

使用字典

另一種選擇
'Reference Microsoft Scripting Runtime 

Dim intCounter1 As Integer 
Dim strArr1() As String 
Dim strArr2() As String 
Dim strDif As String 
Dim dict1 As Dictionary 
Dim varKey As Variant 

strArr1 = Split(Cells(1, 1).Value, ",", , vbTextCompare) 
strArr2 = Split(Cells(2, 1).Value, ",", , vbTextCompare) 
Set dict1 = New Dictionary 

For intCounter1 = LBound(strArr1) To UBound(strArr1) 
    If dict1.Exists(strArr1(intCounter1)) = False Then 
     dict1.Add Key:=strArr1(intCounter1), Item:=1 
    End If 
Next intCounter1 

For intCounter1 = LBound(strArr2) To UBound(strArr2) 
    If dict1.Exists(strArr2(intCounter1)) = False Then 
     If Len(strDif) = 0 Then 
      strDif = strArr2(intCounter1) 
     Else 
      strDif = strDif & ", " & strArr2(intCounter1) 
     End If 
    End If 
Next intCounter1 

Cells(2, 2).Value = strDif 
相關問題