如何判断Excel中两个字符串之间的差异?

时间:2017-04-11 16:47:11

标签: excel excel-vba excel-formula user-defined-functions vba

我创建了一个评估,申请人填写Excel。我有一把钥匙在那里我复制了他们的答案,它告诉我他们的答案是否与我的钥匙相符。 我想添加一个公式,它还会告诉我申请人的单元格(B2)和密钥单元格(A2)之间的差异,以便更容易看出他们出错了。

我尝试使用=SUBSTITUTE(B2,A2,""),但这只会在字符串的开头或结尾给出差异。通常,差异在中间。

例如,我的密钥(单元格A2)可能会说:冷战|猪湾湾菲德尔卡斯特罗

申请人(单元格B2)可能会说:冷战|古巴导弹危机|菲德尔卡斯特罗

我想要这个公式回归:“古巴导弹危机”

2 个答案:

答案 0 :(得分:7)

您可以尝试这样的事情......

Function CompareStrings(keyRng As Range, ansRng As Range) As String
Dim arr() As String
Dim i As Long
arr() = Split(ansRng.Value, "|")
For i = 0 To UBound(arr)
    If InStr(keyRng.Value, arr(i)) = 0 Then
        CompareStrings = arr(i)
        Exit Function
    End If
Next i
End Function

然后你可以像下面这样使用这个UDF ......

=CompareStrings(A2,B2)

如果你想以相反的顺序比较它们并从其中任何一个返回不匹配的字符串部分,试试这个......

Function CompareStrings(ByVal keyRng As Range, ByVal ansRng As Range) As String
Dim arr() As String
Dim i As Long
Dim found As Boolean
arr() = Split(ansRng.Value, "|")
For i = 0 To UBound(arr)
    If InStr(keyRng.Value, Trim(arr(i))) = 0 Then
        found = True
        CompareStrings = arr(i)
        Exit Function
    End If
Next i

If Not found Then
    arr() = Split(keyRng.Value, "|")
    For i = 0 To UBound(arr)
        If InStr(ansRng.Value, Trim(arr(i))) = 0 Then
            CompareStrings = arr(i)
            Exit Function
        End If
    Next i
End If
End Function

像以前一样使用它,如下所示......

=CompareStrings(A2,B2)

因此该函数将首先将B2的所有字符串部分与A2进行比较,如果发现任何不匹配,它将返回字符串的那部分,如果它没有找到任何不匹配,则它将比较所有部分带有B2的A2中的字符串,将返回字符串的任何不匹配部分。所以它会比较两种方式。

enter image description here

答案 1 :(得分:2)

上面的函数只显示第一个差异。这是显示两个字符串之间所有差异的更新。enter image description here

Function CompareStrings(ByVal keyRng As Range, ByVal ansRng As Range) As String
Dim arr() As String
Dim i As Long
arr() = Split(ansRng.Value, " ")
CompareStrings = "+["
For i = 0 To UBound(arr)
    If InStr(keyRng.Value, Trim(arr(i))) = 0 Then
        CompareStrings = CompareStrings & " " & arr(i)
    End If
Next i
CompareStrings = CompareStrings & " ] -["

arr() = Split(keyRng.Value, " ")
For i = 0 To UBound(arr)
    If InStr(ansRng.Value, Trim(arr(i))) = 0 Then
        CompareStrings = CompareStrings & " " & arr(i)
    End If
Next i
CompareStrings = CompareStrings & " ]"
End Function