Duk*_*ver 4 excel vba excel-vba excel-formula user-defined-functions
我创建了一个评估,申请人填写Excel.我有一把钥匙在那里我复制了他们的答案,它告诉我他们的答案是否与我的钥匙相符.我想添加一个公式,它还会告诉我申请人的单元格(B2)和密钥单元格(A2)之间的差异,以便更容易看出他们出了什么问题.
我尝试过使用,=SUBSTITUTE(B2,A2,"")
但这只会给我在字符串开头或结尾的差异.通常,差异在中间.
例如,我的密钥(单元格A2)可能会说:冷战| 猪湾湾 菲德尔卡斯特罗
申请人(单元格B2)可能会说:冷战| 古巴导弹危机| 菲德尔卡斯特罗
我希望这个公式能够回归:"古巴导弹危机"
你可以试试这样的......
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
Run Code Online (Sandbox Code Playgroud)
然后你可以像下面这样使用这个UDF ......
=CompareStrings(A2,B2)
Run Code Online (Sandbox Code Playgroud)
如果你想以相反的顺序比较它们并从其中任何一个返回不匹配的字符串部分,试试这个......
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
Run Code Online (Sandbox Code Playgroud)
像以前一样使用此如下...
=CompareStrings(A2,B2)
Run Code Online (Sandbox Code Playgroud)
因此该函数将首先将B2的所有字符串部分与A2进行比较,如果发现任何不匹配,它将返回字符串的那部分,如果找不到任何不匹配,则它将比较A2中字符串的所有部分. B2并将返回字符串的任何不匹配部分.所以它会比较两种方式.