将 UNIQUE 与不同工作表上的不相邻列一起使用

问题描述 投票:0回答:7

我在两张纸上有两张桌子 - 比如说 tblFruits1 和 tblFruits2。 两者都有一个“名称”列。 例如,苹果公司就出现在这两个列表中。 列表可能有不同的行数

Sheet1 上的 tblFruits1

姓名 颜色
苹果 红色
桃子 黄色
凤梨 黄色

Sheet2 上的 tblFruits2

姓名 颜色
苹果 红色
樱桃 红色
香蕉 黄色
甜瓜 绿色

现在我想在第三张纸上获得两个表的唯一名称列表。

Sheet3 上的预期结果

姓名
苹果
桃子
凤梨
樱桃
香蕉
甜瓜

=UNION((tblFruits1[Name],tblFruits2[Name]))
返回错误。

我尝试了

SEQUENCE
INDEX
的变体,但没有成功。

所以问题是:

如何从两个不同工作表上的两个列范围“构造”UNIQUE 的矩阵参数?

(我正在寻找的是非 VBA 解决方案 - 我知道如何在 VBA 中处理这个问题。)

excel excel-formula office365
7个回答
6
投票

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]))

给出您想要的结果


3
投票

尝试:

=LET(X,CHOOSE({1,2},tblFruits1[Name],tblFruits2[Name]),Y,COUNTA(X),Z,MOD(SEQUENCE(Y)-1,Y/2)+1,A,INDEX(X,Z,CEILING(SEQUENCE(Y)/(Y/2),1)),UNIQUE(FILTER(A,NOT(ISNA(A)))))


1
投票

这是我创建的一个解决方案,您可以用任意两个数组、动态数组等替换 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))))))
)

1
投票

几个答案已经提到了

VSTACK
函数来返回两个表或数组的并集,它现在在多个 Excel 版本中可用。它可以与
UNIQUE
结合使用(正如已经说过的):

=UNIQUE(VSTACK(tblFruits1[Name];tblFruits2[Name]))

这是结果的屏幕截图(在 Excel 365 上尝试过):


0
投票

你可以尝试这样将Sheet1数据和Sheet2数据放入Table中吗 在 Sheet3 单元格 A2 中复制粘贴以下公式

=UNIQUE(FILTERXML(""&TEXTJOIN("",1,(IFNA(IF({0,1},表1[名称],表2[名称]),"")))&"", “//b”),假,假)


0
投票

有一个新函数可以简化此操作:VSTACK

对于唯一(不同)的联合(根据原始问题),请尝试以下操作:

=UNIQUE((tblFruits1[Name],tblFruits2[Name]))

并对它们进行排序:

=SORT(UNIQUE((tblFruits1[Name],tblFruits2[Name])))

0
投票

我目前没有

VSTACK
HSTACK
(或
LAMBDA
),除非我将工作簿保存在缓慢而笨重的 Excel Online 上。但是假设您有 3 个动态数组(名为 Threefour 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
能够在桌面上使用那就太好了。)

© www.soinside.com 2019 - 2024. All rights reserved.