假设我在一个Excel单元格中有以下文本字符串:
John John John Mary Mary
我想在另一个单元格上创建一个公式(所以没有菜单函数或VBA)
John Mary
我怎样才能做到这一点?
我到目前为止所尝试的是搜索互联网和SO搜索问题所有我能找到的解决方案涉及Excel的内置重复删除或涉及countif
和替换""
的重复项。我还看了一下Excel函数列表,特别是那些来自“Text”类别的函数,但找不到任何有趣的东西,可以在一个单元格上完成。
答案在这里:https://www.extendoffice.com/documents/excel/2133-excel-remove-duplicate-characters-in-string.html
Function RemoveDupes2(txt As String, Optional delim As String = " ") As String
Dim x
'Updateby20140924
With CreateObject("Scripting.Dictionary")
.CompareMode = vbTextCompare
For Each x In Split(txt, delim)
If Trim(x) <> "" And Not .exists(Trim(x)) Then .Add Trim(x), Nothing
Next
If .Count > 0 Then RemoveDupes2 = Join(.keys, delim)
End With
End Function
将上面的代码放在一个模块中
使用=remove(A2,",")
A2包含重复的文本分隔,您可以更改分隔符
正如我所写,用VBA解决这个问题很简单。如果您不能使用VBA,一种方法是使用辅助列。
假设:你的字符串在A1中
输入以下公式:
C1: =IFERROR(INDEX(TRIM(MID(SUBSTITUTE($A$1," ",REPT(" ",99)),(ROW(INDIRECT("1:" & LEN($A$1)-LEN(SUBSTITUTE($A$1," ",""))+1))-1)*99+((ROW(INDIRECT("1:" & LEN($A$1)-LEN(SUBSTITUTE($A$1," ",""))+1))=1)),99)),ROWS($1:1),1),"")
D1: =IF(COUNTIF(C1:$C$5,C1)=1,C1,"")
选择C1和D1并向下填充,直到开始获得空白
E1: =D1
E2: =TRIM(CONCATENATE(D2," ",E1))
选择E2并填写。
E列中填写的最后一个单元格的内容将是您的结果。
如果您想要一个自动返回E列范围内最后一个单元格内容的单元格,您可以使用如下公式:
=LOOKUP(REPT("z",99),$E$1:$E$100)
如果没有公式:将文本添加到以空格作为分隔符的列,转置输出,将“删除重复项”单独应用于每个列,然后转置结果。
假设您在单元格中永远不会有两个以上的不同名称,这应该有效:
=MID(A1&" ",1,FIND(" ",A1&" "))&
MID(SUBSTITUTE(A1&" ",MID(A1&" ",1,FIND(" ",A1&" ")),"")&" ",1,
FIND(" ",SUBSTITUTE(A1&" ",MID(A1&" ",1,FIND(" ",A1&" "))&" ","")))
它将显示John Mary
所有这些:
John John John Mary Mary
John Mary
John Mary John Mary
John Mary Mary
John John Mary
它将显示John
所有这些:
John
John John
John John John
如果A1
是空白的,它将不会显示任何内容。
找到一个可能有用的解决方案,如果你也是列表的那个。
如果您通过将上面的单元格与当前行组合来创建列表,则可以使用以下代码检查该值是否已在上面的单元格中:
if(iserror(find(value_to_be_added,previous_concatenation)),
previous_concatenation&" "&value_to_be_added,previous_concatenation)
我在这个主题https://superuser.com/questions/643909/remove-duplicate-entries-in-one-cell找到了答案
=join(" ",unique(transpose(split(A1," "))))