如何区分 Excel 中的两个字符串?

How can I tell the differences between two strings in Excel?

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

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

例如,我的密钥(单元格 A2)可能会显示:Cold War |猪湾 |菲德尔·卡斯特罗

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

我想要这个公式return:"Cuban Missile Crisis"

您可以尝试这样的操作...

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)

如果您还想以相反的顺序比较它们并且 return 它们中任何一个的不匹配的字符串部分,试试这个...

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 进行比较,如果发现任何不匹配,它将 return 字符串的那部分,如果没有发现任何不匹配,则它将将 A2 中字符串的所有部分与 B2 进行比较,并将 return 字符串的任何不匹配部分。所以它会比较两种方式。

上面的函数只显示第一个差异。这是一个显示两个字符串之间所有差异的更新。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