我在两张纸上有两张桌子 - 比如说 tblFruits1 和 tblFruits2。 两者都有一个“名称”列。 例如,苹果公司就出现在这两个列表中。 列表可能有不同的行数
Sheet1 上的 tblFruits1
姓名 | 颜色 |
---|---|
苹果 | 红色 |
桃子 | 黄色 |
凤梨 | 黄色 |
Sheet2 上的 tblFruits2
姓名 | 颜色 |
---|---|
苹果 | 红色 |
樱桃 | 红色 |
香蕉 | 黄色 |
甜瓜 | 绿色 |
现在我想在第三张纸上获得两个表的唯一名称列表。
Sheet3 上的预期结果
姓名 |
---|
苹果 |
桃子 |
凤梨 |
樱桃 |
香蕉 |
甜瓜 |
=UNION((tblFruits1[Name],tblFruits2[Name]))
返回错误。
我尝试了
SEQUENCE
和 INDEX
的变体,但没有成功。
所以问题是:
如何从两个不同工作表上的两个列范围“构造”UNIQUE 的矩阵参数?
(我正在寻找的是非 VBA 解决方案 - 我知道如何在 VBA 中处理这个问题。)
VSTACK
功能使联盟变得过时(仅在撰写本文时可供内部人员使用)
由于查找多个范围的并集本身就是一个非常有用的函数,因此我使用 LAMBDA 来做到这一点。然后可以将其输出传递给 UNIQUE
Lambda,我毫无想象力地将其称为 UNION
=LAMBDA(tabl1, tabl2,
LET(rowindex, SEQUENCE(ROWS(tabl1)+ROWS(tabl2)),
colindex, SEQUENCE(1,COLUMNS(tabl1)),
IF(rowindex<=ROWS(tabl1),
INDEX(tabl1,rowindex,colindex),
INDEX(tabl2,rowindex-ROWS(tabl1),colindex)
)
)
)
然后
=UNIQUE(Union(tblFruits1[Name],tblFruits2[Name]))
给出您想要的结果
这是我创建的一个解决方案,您可以用任意两个数组、动态数组等替换 a2# 和 c2#。它还会对其进行重复数据删除和排序。这适用于 Excel for Mac(不支持 FILTERXML)
=LET(
firstArray, a2#,
secondArray, c2#,
totalCount, COUNTA(firstArray)+COUNTA(secondArray),
firstCount, COUNTA(firstArray),
SORT(UNIQUE(MAKEARRAY(totalCount,1,LAMBDA(r,c,IF(r<=firstCount,INDEX(firstArray,r),INDEX(secondArray,r-firstCount+1))))))
)
你可以尝试这样将Sheet1数据和Sheet2数据放入Table中吗 在 Sheet3 单元格 A2 中复制粘贴以下公式
=UNIQUE(FILTERXML(""&TEXTJOIN("",1,(IFNA(IF({0,1},表1[名称],表2[名称]),"")))&"", “//b”),假,假)
有一个新函数可以简化此操作:VSTACK
对于唯一(不同)的联合(根据原始问题),请尝试以下操作:
=UNIQUE((tblFruits1[Name],tblFruits2[Name]))
并对它们进行排序:
=SORT(UNIQUE((tblFruits1[Name],tblFruits2[Name])))
我目前没有
VSTACK
或 HSTACK
(或 LAMBDA
),除非我将工作簿保存在缓慢而笨重的 Excel Online 上。但是假设您有 3 个动态数组(名为 Three、four 和 Five),每个数组都有 2 列和可变数量的行。然后(为了保持可读性)使用命名公式 combo 定义为 =SEQUENCE(ROWS(three)+ROWS(four)+ROWS(five))
。然后这有效:
=IFS(
combo<=ROWS(three), three,
combo<=ROWS(three)+ROWS(four), INDEX(four,combo-ROWS(three),{1,2}),
TRUE, INDEX(five,combo-ROWS(three)-ROWS(four),{1,2})
)
如果愿意,您可以将
UNIQUE
和/或 SORT
包裹起来。如果数组有 3 列而不是 2 列,则在公式中使用 {1,2,3}
。
显然,您可以通过在 IFS
公式中构建更多条件来将其扩展到 3 个以上的数组。
也许值得注意的是,
three
与INDEX(three,combo,{1,2})
是同一件事。使用 COLUMN(three)
将使语法更具通用性,但如果您想要在输出中使用类似 {2,1,3}
的内容,它不允许您对列重新排序。另外,TRUE
实际上是在IFS
公式中说“ELSE”的方式——它比combo<=ROWS(three)+ROWS(four)+ROWS(five)
更简洁。使用这些较长的形式将使公式更加对称,但也会更加冗长!
(如果
VSTACK
能够在桌面上使用那就太好了。)