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)
新答案:
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 的免费插件获取。
上面的代码也会处理空值。现在:
结果表:
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)
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。
尽管如此,这更复杂,它没有字符限制。
我正在提供这个问题的答案,因为它被标记为与该线程重复。您可以直接从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