【问题标题】:Excel UNIQUE Across ColumnsExcel 跨列唯一
【发布时间】:2020-06-04 21:57:31
【问题描述】:

新函数UNIQUE 是否可以跨列使用并将输出溢出到单个列中?


基于Columns: A, B, & C 中存在的所有值,所需的输出是单个列中的UNIQUE 值(示例中的红色重复


  • 如果我只使用 UNIQUE(A7:C7),我会得到跨列的溢出范围(这甚至没有提供跨列的唯一值,这是出乎意料的
  • 我也尝试了UNIQUE(A2:A6) & UNIQUE(B5:B10) & UNIQUE(C2:C5),但这只是连接了值(也是意外但不相关

【问题讨论】:

  • 你能不接受接受的答案吗?我相信有比FILTERXML 更好的答案,尤其是引入TOCOL
  • 我绝对可以,但是,我应该吗?您的回答(@BigBen)解决了我在生产中使用的文件中的实际问题(它仍然对您如此赞誉),所以这就是为什么我接受了它,但很高兴看到其他人可能更喜欢的其他答案。我绝对喜欢TOCOL,但我无法使用该公式,因此无法使用它
  • 好吧,我想这取决于你。我只是认为我的答案低劣。

标签: excel excel-formula office365 powerquery dynamic-arrays


【解决方案1】:

可能有更好的方法,但这里是使用 TEXTJOIN 和 FILTERXML 创建一个可以调用 UNIQUE 的数组:

=SORT(UNIQUE(FILTERXML("<t><s>"&TEXTJOIN("</s><s>",TRUE,A1:C6)&"</s></t>","//s")))

【讨论】:

  • 我也在玩TEXTJOIN,但FILTERXML 成功了。期待这会更简单,但我想这是 UNIQUEs 使用的边缘案例 - 一如既往的出色解决方案
  • 是的...我很想看看其他人的想法,如果您得到更多答案,我不会感到惊讶。
  • 它适用于小范围,但如果你有几百个单元格,它会损坏。感谢您的信息。
  • @AntonioLuna - 是的,TEXTJOIN 有字符限制,因此您可以考虑此线程中不使用它的其他答案。
【解决方案2】:

TEXTJOIN 确实有字符限制。我们可以通过 INDEX、SEQUENCE 和 FILTER 来克服这个问题:

=SORT(UNIQUE(FILTER(INDEX(A1:C6,MOD(SEQUENCE(COLUMNS(A1:C6)*ROWS(A1:C6),,0),MAX(ROW(A1:C6)))+1,INT(SEQUENCE(COLUMNS(A1:C6)*ROWS(A1:C6),,0)/(MAX(ROW(A1:C6))))+1),INDEX(A1:C6,MOD(SEQUENCE(COLUMNS(A1:C6)*ROWS(A1:C6),,0),MAX(ROW(A1:C6)))+1,INT(SEQUENCE(COLUMNS(A1:C6)*ROWS(A1:C6),,0)/(MAX(ROW(A1:C6))))+1)&""<>"")))

INDEX 创建一个垂直数组,可以先将其传递给 FILTER 以删除空白,然后再传递给 UNIQUE。

虽然这比较复杂,但没有字符限制。

【讨论】:

  • 终于!这个问题的另一个答案。
  • @BigBen 是的,直到我关闭一个作为这个副本的副本并通过文本意识到,TEXTJOIN 会很快达到限制。
  • 是的,这是原始方法的明显缺点。
  • 感谢您的帮助!
  • LET() 可能是对这个答案的一个很好的补充(如果有人还可以访问该功能)=)
【解决方案3】:

新答案:

Ms365 的新阵列整形功能将很有用:

=UNIQUE(TOCOL(A2:C7,3,1))

TOCOL() 将返回除错误或空 (3) 值之外的所有值的向量 (1)。


旧答案:

使用可访问LET() 的 Microsoft365,您可以使用:

E2中的公式:

=LET(X,A2:C7,Y,SEQUENCE(ROWS(X)*COLUMNS(X)),Z,INDEX(IF(X="","",X),1+MOD(Y,ROWS(X)),ROUNDUP(Y/ROWS(X),0)),SORT(UNIQUE(FILTER(Z,Z<>""))))

这样,公式变得很容易重复使用,因为我们必须更改的唯一参数是对“X”的引用。


对于它的价值,它也可以通过 PowerQuery A.K.A. 来完成。 Get&Transform,可从 Excel2013 或 Excel 2010 的免费插件中获得。

  • 选择您的数据(包括标题)。转到功能区 > 数据 > “从表/范围”。
  • 确认您的数据有标题并且 PowerQuery 应该打开。
  • 在 PowerQuery 中选择所有列。转到“变换”>“转置”。
  • 再次选择所有列。转到“转换”>“取消透视列”。

上面也会处理空值。现在:

  • 选择属性列并将其删除。
  • 对剩余的列进行排序并删除重复项(右键单击标题>“删除重复项”)。
  • 关闭 PowerQuery 并保存更改。

结果表:

M-Code:

let
    Source = Excel.CurrentWorkbook(){[Name="Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"A Values", Int64.Type}, {"B Values", Int64.Type}, {"C Values", Int64.Type}}),
    #"Transposed Table" = Table.Transpose(#"Changed Type"),
    #"Unpivoted Columns" = Table.UnpivotOtherColumns(#"Transposed Table", {}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Columns",{"Attribute"}),
    #"Sorted Rows" = Table.Sort(#"Removed Columns",{{"Value", Order.Ascending}}),
    #"Removed Duplicates" = Table.Distinct(#"Sorted Rows")
in
    #"Removed Duplicates"

【讨论】:

  • TOCOL 的引入意味着这应该是公认的答案,恕我直言。
  • @BigBen,返回更新任何旧答案将是一个难题。在给出答案时,您的答案会非常好(对于许多 Excel 用户来说仍然如此)。这里不需要换。我的热情让我更新了一些具体的帖子。
【解决方案4】:

我正在为这个question 提供答案,因为它被标记为与该线程重复。您可以直接从FILTERXML() 公式中获取唯一值,而无需使用UNIQUE 函数。所以,你可以使用这个函数来非 O365 擅长只有 TEXTJOIN()FILTERXML() 函数例如:Excel2019

FILTERXML() 可能会以最佳方式提供您想要的结果。试试下面的公式-

=FILTERXML("<t><s>"&TEXTJOIN("</s><s>",TRUE,B4:D10)&"</s></t>","//s[not(preceding::*=.)]")
  • Textjoin() 与分隔符 &lt;/s&gt;&lt;s&gt; 将连接指定范围内的所有非空单元格以构造有效的 XML 字符串。
  • "&lt;t&gt;&lt;s&gt;"&amp;TEXTJOIN("&lt;/s&gt;&lt;s&gt;",TRUE,B4:D10)&amp;"&lt;/s&gt;&lt;/t&gt;" 将构造XML 字符串以通过FILTERXML() 公式处理。
  • XPath 参数 //s 将返回所有节点,而 [not(preceding::*=.)] 将仅过滤唯一节点。
  • 您可以调整B4:D10 的范围以供将来输入数据,这样每当您输入任何文本时,它都会自动出现在结果列中。

JvdV 对FILTERXML() 的诊断文章在这里Excel - Extract substring(s) from string using FILTERXML

【讨论】:

  • 它帮助了我。感谢您的努力和很好的解释。
【解决方案5】:

您可以使用我的存储库中的DM_ARRAY 函数:VBA-ArrayTools。有一个演示工作簿可用,您将找到每个用户定义函数 (UDF) 的专用工作表。对于DM_ARRAY,第一个参数是您想要作为输出的列数,然后您可以根据需要传递任意数量的范围。在您的情况下,您可以使用 =UNIQUE(DM_ARRAY(1,A2:A6,B5:B10,C2:C5)) 实现所需的结果。

【讨论】:

  • @urdearboy 我明白,但我认为你错过了一个细节。在源代码位于文本文件中的链接中,有一个名为Code Modules 的文件夹。为了方便起见,工作簿只是一个可选的演示。另外,我不能仅仅因为它使用了很多实用函数而仅仅分享该函数的源代码。因此,我更喜欢链接到整个源代码。有 2 个主要模块:一个带有 UDF,另一个带有纯 VBA 功能,可在任何其他主机应用程序(如 Word)中工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多