【问题标题】:Remove duplicates within Excel cell删除 Excel 单元格中的重复项
【发布时间】:2014-11-11 21:28:16
【问题描述】:

假设我在一个 Excel 单元格中有以下文本字符串:

John John John Mary Mary

我想在另一个单元格上创建一个公式(所以请不要使用菜单函数或 VBA)

John Mary

我该怎么做?

到目前为止,我尝试在互联网上搜索有关该问题的 SO,我所能找到的只是涉及 Excel 内置重复删除或涉及 countif 的解决方案以及替换 "" 的重复项。我还查看了 Excel 函数列表,尤其是那些来自“文本”类别的函数,但找不到任何有趣的东西,可以在一个单元格上完成。

【问题讨论】:

  • 你试过什么?你采取什么样的方法?用 VBA 解决是一个微不足道的问题;只用公式就不是那么简单了。您也许可以使用辅助列来做到这一点。
  • @RonRosenfeld,我会用我解决问题的微不足道的尝试来更新 Q。
  • 我可以理解只使用公式的必要性,但我可以问为什么你不能使用一些 VBA 来将宏附加到工作表上的形状或按钮?我纯粹是好奇。甚至是工作表中内置的事件。嗯?
  • @PJRosenburg,我们的许多用户使用 Calc 而不是 Excel;根据我的经验,除了最简单的 VBA 宏之外,Calc 并不能很好地解释任何内容。

标签: excel duplicates excel-formula cell duplicate-removal


【解决方案1】:

正如我所写,使用 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)

【讨论】:

  • 谢谢,罗恩。这似乎不适用于我的真实案例,但我会进一步考虑。
  • @WaldirLeoncio 它适用于您的示例数据。如果您的样本不具有代表性,请编辑您的原始问题以提供有关失败的信息。
【解决方案2】:

没有公式:文本到以空格为分隔符的列,转置输出,将 Remove Duplicates 单独应用于每个列,然后转置结果。

【讨论】:

  • 感谢您的意见,但我真的需要它在没有用户干预的情况下工作。对于客户来说,这是一个复杂的电子表格,我不希望他做任何事情,只需要填写单元格。
【解决方案3】:

假设您在一个单元格中永远不会有超过两个不同的名称,这应该可以工作:

=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 为空,它将不显示任何内容。

【讨论】:

  • 这确实适用于两个不同的名称。我会看看是否可以将其概括为潜在的 16 个名称。谢谢!
  • 这个特殊的策略对于 3 个名字来说会变得非常棘手,而且你可能会在达到 16 个名字之前很久就达到一些 Excel 限制。它基本上是一种递归算法:A)抓取第一个单词,B)从字符串的其余部分中删除它,C)连接 A 和 B,[对步骤 B 的结果重复步骤 A-C,...]。您的问题突出了 Excel 字符串操作的弱点。 (尤其是无法使用正则表达式。)此外,Excel 缺少类似eval 的函数,这使得在不诉诸 VBA 或使用“隐藏”单元格的情况下很难做到这一点。
  • @RickHitchcock 有没有办法在没有尾随逗号和最多 3 个唯一字符串的情况下做到这一点?
  • 不确定尾随逗号是什么意思,但我当然不建议对超过 2 个唯一字符串使用此策略。如果不使用 VBA,Excel 就不能很好地处理这个问题。
【解决方案4】:

答案在这里: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

将上面的代码放在一个模块中

使用=RemoveDupes2(A2,",") A2 包含由 , 分隔的重复文本 您可以更改分隔符

【讨论】:

  • 这对我不起作用,对于 13 个字符的数字。
【解决方案5】:

找到了一个解决方案,如果您也是列出该列表的人,该解决方案可能会奏效。

当您通过将上面的单元格与当前行组合来创建列表时,您可以使用以下代码检查该值是否已经在上面的单元格中:

if(iserror(find(value_to_be_added,previous_concatenation)),
    previous_concatenation&" "&value_to_be_added,previous_concatenation)

【讨论】:

    【解决方案6】:

    我在这个帖子https://superuser.com/questions/643909/remove-duplicate-entries-in-one-cell找到了下面的答案

    =join(" ",unique(transpose(split(A1," "))))

    【讨论】:

    • 原始答案涉及在 Google 表格中使用该功能。 Microsoft Excel 没有“加入”功能。
    【解决方案7】:

    您尝试过 textjoin 功能吗? (在 Excel 2016 中可用,不确定以前的版本)。只是在寻找类似的东西,这似乎在我不止一次拥有多个值的列上为我完成了这项工作。

    =TEXTJOIN(delimiter;ignore_empty;text)
    
    • 以任何您需要的方式定义分隔符
    • ignore empty 可以是真也可以是假,这取决于满足您的需求
    • text 将是您的值数组 - 在此处使用 unique 函数(参见下面的示例)将过滤掉任何字符串的任何倍数(我将它用于数字并且它有效)

    示例:

    =TEXTJOIN(" ";TRUE;UNIQUE($A$1:$A$16))
    

    猜猜这可能是 Excel 相当于 google sheet 的 join 功能。如果您输入 =join,则会出现 Textjoin - 我采用了上面 user11308575 帖子中提供的公式,但删除了括号及其内容,然后从那里开始。

    希望这会有所帮助(即使线程已经很旧);)

    【讨论】:

    • 理论是存在的,但你只是错过了 OP 在一个单元格中有一个字符串,他需要从中删除重复项。
    【解决方案8】:

    如果可以访问TEXTJOIN,则可以使用:

    =TEXTJOIN(" ",,FILTERXML("<t><s>"&SUBSTITUTE(A1," ","</s><s>")&"</s></t>","//s[not(preceding::*=.)]"))
    

    【讨论】:

    • 当我在包含“John John John Mary Mary”的单元格上尝试此操作时,它只返回“John”。我希望这个工作,但它不适合我。我希望我能更好地理解它在做什么。
    猜你喜欢
    • 2015-03-11
    • 2023-04-05
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    相关资源
    最近更新 更多