删除Excel单元格中的重复项
假设我在一个Excel单元格中有以下文本字符串:删除Excel单元格中的重复项,excel,duplicates,excel-formula,cell,duplicate-removal,Excel,Duplicates,Excel Formula,Cell,Duplicate Removal,假设我在一个Excel单元格中有以下文本字符串: John John John Mary Mary 我想在另一个单元格上创建一个公式(请不要使用菜单函数或VBA) John Mary 我该怎么做 到目前为止,我所做的是搜索互联网,搜索有关该问题的信息,我所能找到的只是涉及Excel内置的删除重复项的解决方案,或者涉及到countif和替换的重复项的解决方案。我还查看了Excel函数列表,特别是那些来自“文本”类别的函数,但找不到任何有趣的、可以在一个单元格上完成的功能。正如我所写的,用VBA
John John John Mary Mary
我想在另一个单元格上创建一个公式(请不要使用菜单函数或VBA)
John Mary
我该怎么做
到目前为止,我所做的是搜索互联网,搜索有关该问题的信息,我所能找到的只是涉及Excel内置的删除重复项的解决方案,或者涉及到
countif
和替换的重复项的解决方案。我还查看了Excel函数列表,特别是那些来自“文本”类别的函数,但找不到任何有趣的、可以在一个单元格上完成的功能。正如我所写的,用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
:
John John John Mary Mary
John Mary
John Mary John Mary
John Mary Mary
John John Mary
John
John John
John John John
如果A1
为空,则不会显示任何内容。答案如下:
函数RemoveDupes2(txt作为字符串,可选delim作为字符串=”)作为字符串
暗x
'Updateby20140924
使用CreateObject(“Scripting.Dictionary”)
.CompareMode=vbTextCompare
对于拆分中的每个x(txt、delim)
如果Trim(x)“,且不存在(Trim(x)),则添加Trim(x),无任何内容
下一个
如果.Count>0,则RemoveDupes2=Join(.keys,delim)
以
端函数
将上面的代码放入模块中
使用=RemoveDupes2(A2,“,”)
A2包含由分隔的重复文本,
您可以更改分隔符如果您也是列表中的一员,则找到一个可能有效的解决方案
当您通过将上面的单元格与当前行组合来创建列表时,可以使用以下代码检查该值是否已在上面的单元格中:
if(iserror(find(value_to_be_added,previous_concatenation)),
previous_concatenation&" "&value_to_be_added,previous_concatenation)
我在下面的帖子中找到了答案
=join(“),unique(转置(split(A1,”))
您是否尝试了textjoin函数?(在Excel 2016中提供,不确定以前的版本)。我只是在找一些类似的东西,这似乎可以帮我在一个专栏上完成这项工作,我不止一次地拥有多个值
=TEXTJOIN(delimiter;ignore_empty;text)
- 以任何需要的方式定义分隔符
- “忽略空”可以是真的,也可以是假的,这取决于满足您需求的内容
- 文本将是您的值数组-使用此处的unique函数(参见下面的示例)将过滤掉任何字符串的任何倍数(我将其用于数字,它可以工作)
示例:
=TEXTJOIN(" ";TRUE;UNIQUE($A$1:$A$16))
我猜这可能是Excel相当于GoogleSheets的连接功能。如果你输入=join,就会出现Textjoin——我采用了上面user11308575帖子中提供的公式,但删除了偏执及其内容,然后从那里开始
希望这能有所帮助(即使线已经旧了);) 如果可以访问TEXTJOIN
可以使用:
=TEXTJOIN(" ",,FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[not(preceding::*=.)]"))
=TEXTJOIN(“,”FILTERXML(“&SUBSTITUTE(A1,“,”)&“//s[非(前面的:*=)]”)
您尝试过什么?你采取什么样的方法?这是一个用VBA解决的小问题;只是公式就不那么简单了。您可能可以使用帮助器列来完成此操作。@RonRosenfeld,我将用解决此问题的微不足道的尝试来更新Q。我理解只使用公式的必要性,但我可以问一下,为什么您不能在将宏附加到工作表上的形状或按钮的情况下使用VBA来完成此操作?我完全好奇。甚至是工作表中内置的事件。嗯?@PJRosenburg,我们的许多用户使用Calc而不是Excel;根据我的经验,Calc除了解释最简单的VBA宏外,在解释任何东西方面都做得不好。谢谢你的输入,但我真的需要它在没有用户干预的情况下工作。对于一个客户来说,这是一个复杂的电子表格,我不想让他做任何事情,只是填写单元格。谢谢,罗恩。这似乎不适合我的实际案例,但我会进一步考虑。@WaldirLeoncio它适用于您的示例数据。如果您的示例不具有代表性,请编辑原始问题,以提供有关失败的信息。这确实适用于两个不同的名称。我看看能不能把它推广到16个名字。谢谢对于3个名字来说,这种特殊的策略会变得非常棘手,在你得到16个名字之前,你可能会达到一些Excel限制。这基本上是一个递归算法:a)抓取第一个单词,B)从字符串的其余部分删除它,C)连接a和B,[对步骤B的结果重复步骤a-C,…]。您的问题突出了Excel字符串操作的弱点。(特别是不能使用正则表达式。)此外,Excel缺少类似于eval
的函数,这使得在不使用VBA或“隐藏”的情况下很难实现这类功能单元格。@RickHitchcock有没有办法在不使用尾随逗号的情况下对最多3个唯一字符串执行此操作?不确定尾随逗号是什么意思,但我当然不建议对超过2个唯一字符串使用此策略。如果不使用VBA,Excel无法很好地处理这个问题。对于13个字符的数字,这对我来说不起作用。最初的答案是关于在Google Sheets中使用该函数。Microsoft Excel没有“连接”功能。理论是这样的,但你只是忽略了一点,OP在一个单元格中有一个字符串,他需要删除d