如何解决在Excel中识别两个文本字符串之间的不同值
我正在将实验室信息导入excel,这就是全部文本,但是我需要比较结果之前和之后的结果以及现在结果为负的ID。 例如,单元格A1 =“ A3 B27 A23 DQ8”,单元格B1 =“ A3 A23 DR16”。我希望我可以使用VBA函数将值“ B27 DQ8”返回到单元格C1中-结果不再包含在文本字符串中。 我在引用这篇帖子How can I tell the differences between two strings in Excel?
代码是
Function CompareStrings(keyRng As Range,ansRng As Range) As String <br />
Dim arr() As String <br />
Dim i As Long <br />
arr() = Split(ansRng.Value,"|") <br />
For i = 0 To UBound(arr) <br />
If InStr(keyRng.Value,arr(i)) = 0 Then <br />
CompareStrings = arr(i) <br />
Exit Function <br />
End If <br />
Next I <br />
End Function <br />
UDF: =CompareStrings(A2,B2)
起作用了,只是它只返回一个值,而不是现在为负的倍数。
我也尝试过此突出显示代码https://www.extendoffice.com/documents/excel/3716-excel-compare-two-strings-highlight-differences-for-similarity.html 但是我认为这是将整个字符串视为一个值,而不是用空格分隔。
不幸的是,我得到的信息在一个文本字符串中包含数十个值,并且它们没有任何数字或字母顺序,因此使排序变得更加困难。
解决方法
如果一个人有权访问TEXTJOIN()
,则可以使用:
C1
中的公式:
=TEXTJOIN(" ",FILTERXML(SUBSTITUTE("<x><t>"&A1&" "&"</t></x>"," ","<s> "&B1&" </s></t><t>"),"//t[.//*[not(contains(.,concat(' ',../text(),' ')))]]"))
这里的技巧是创建有效的XML
表达式:
<x>
<t>A3
<s> A3 A23 DR16 </s>
</t>
<t>B27
<s> A3 A23 DR16 </s>
</t>
<t>A23
<s> A3 A23 DR16 </s>
</t>
<t>DQ8
<s> A3 A23 DR16 </s>
</t>
<t>
</t>
</x>
XPATH
表达式将返回其子级不包含其父级<t>
节点文本的所有<t>
节点。我们将空格连接起来,以确保不会误匹配误报。
是的,如果您无权访问TEXTJOIN
,但您确实有Excel 2013(因此也有对FILTERXML
的访问权限),则可以轻松创建一个UDF以模拟TEXTJOIN
。例如:
Function TEXTJOIN(XMLstr As String,XPATHstr As String) As String
With Application
TEXTJOIN = Join(.Transpose(.FilterXML(XMLstr,XPATHstr))," ")
End With
End Function
可以通过=TEXTJOIN(SUBSTITUTE("<x><t>"&A1&" "&"</t></x>",' ')))]]")
来调用。
要使用VBA进行此操作,建议使用Dictionary对象。
- 与A分隔的每个子串都添加到字典中。
- 字典中与B分隔的每个子字符串都将从字典中删除。
Option Explicit
Function compareStrings(S1 As String,S2 As String) As String
Dim myD As Object,v,w,I As Long
Set myD = CreateObject("Scripting.Dictionary")
myD.comparemode = vbTextCompare
v = Split(S1)
For Each w In v
If Not myD.exists(w) Then myD.Add w,w
Next w
v = Split(S2)
For Each w In v
If myD.exists(w) Then myD.Remove w
Next w
compareStrings = Join(myD.keys)
End Function
您也可以使用Power Query执行此操作。 除了使用列表而不是字典以外,该算法是相同的:
let
//Change table name in next line to reflect name of table on your worksheet
Source = Excel.CurrentWorkbook(){[Name="Table10"]}[Content],#"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1",type text},{"Column2",type text}}),#"Added Custom" = Table.AddColumn(#"Changed Type","Column3",each
List.RemoveMatchingItems(
Text.Split([Column1]," "),Text.Split([Column2]," "))),#"Extracted Values" = Table.TransformColumns(#"Added Custom",{"Column3",each Text.Combine(List.Transform(_,Text.From),type text})
in
#"Extracted Values"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。