Excel 跨列唯一

urd*_*boy 7 excel excel-formula dynamic-arrays office365

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


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

在此处输入图片说明


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

Big*_*Ben 10

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

=SORT(UNIQUE(FILTERXML("<t><s>"&TEXTJOIN("</s><s>",TRUE,A1:C6)&"</s></t>","//s")))
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


Jvd*_*vdV 9

新答案:

Ms365 的新数组整形函数将会很有用:

=UNIQUE(TOCOL(A2:C7,3,1))
Run Code Online (Sandbox Code Playgroud)

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


旧答案:

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

在此输入图像描述

公式为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<>""))))
Run Code Online (Sandbox Code Playgroud)

这样,公式就可以轻松地重复使用,因为我们唯一需要更改的参数是对“X”的引用。


无论如何,它也可以通过 PowerQuery AKA 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"
Run Code Online (Sandbox Code Playgroud)


Sco*_*ner 5

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)&""<>"")))
Run Code Online (Sandbox Code Playgroud)

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

尽管如此,这更复杂,它没有字符限制。

在此处输入图片说明

  • `LET()` 可能是对这个答案的一个很好的补充(如果已经可以访问该函数)=) (2认同)

Har*_*4HR 5

我正在提供这个问题的答案,因为它被标记为与该线程重复。您可以直接从FILTERXML()公式中获取唯一值而无需UNIQUE函数。因此,您可以将此功能用于非O365擅长仅拥有TEXTJOIN()FILTERXML()功能 Ex: Excel2019

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

=FILTERXML("<t><s>"&TEXTJOIN("</s><s>",TRUE,B4:D10)&"</s></t>","//s[not(preceding::*=.)]")
Run Code Online (Sandbox Code Playgroud)
  • Textjoin()with delimeter</s><s>将连接指定范围内的所有非空单元格以构造有效XML字符串。
  • "<t><s>"&TEXTJOIN("</s><s>",TRUE,B4:D10)&"</s></t>"将构造XML字符串以按FILTERXML()公式处理。
  • XPath参数//s将返回所有节点,其中[not(preceding::*=.)]将仅过滤唯一节点。
  • 您可以调整B4:D10未来数据输入的范围,这样无论何时输入任何文本,它都会自动出现在结果列中。

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

在此处输入图片说明