多列并集为一列

Posted

技术标签:

【中文标题】多列并集为一列【英文标题】:Union of multiple columns as one column 【发布时间】:2015-07-29 09:32:49 【问题描述】:

您能否建议使用或不使用 VBA 为 12 个单独的列(位于工作簿中的 12 个不同 Excel 工作表中)创建联合列的最佳方法?

有很好的手册如何在没有 VBA 的情况下处理两列(使用 MATCH 函数),但是我不确定如何处理多列的情况。

【问题讨论】:

你能举一个源数据的例子以及你想要的结果吗? 我有 12 张纸,每张纸在一列中包含项目的编号 ID。我想要一个单独的工作表,它将创建一个列,其中包含来自单独工作表的所有单个项目 ID 列的联合(可能按升序排列)。谢谢! Union method 不会聚合来自不同工作表的不同范围。您需要遍历工作表并将列数据收集到一个集中位置,然后进行重复数据删除和排序。 我认为您的选择是 a) 编写一个 VBA 宏,将每个源工作表中适当数量的单元格复制并粘贴到目标工作表上的单个列中,然后对其进行排序并删除重复项列,或 b) 将每个源范围定义为 Excel 表,然后通过 Get External Data 命令使用 MS Query 并使用 SELECT DISTINCTUNIONORDER BY 手动编写 SQL 查询以返回您想要的数据. 【参考方案1】:

我认为可以使用multiple consolidation ranges 来实现数据透视表。将需要列的标签,并且每张纸需要多于一列(可以克隆现有的)。应该自动排序并从列表中删除重复项(如果克隆)。

【讨论】:

【参考方案2】:

编辑:

我假设您的 ID 都是数字的(否则,如果没有 VBA,排序将非常棘手,如果不是不可能的话)。您可以修改以下数组公式以满足您的需要(选择一个具有足够行以容纳整个 ID 堆栈的区域,输入公式,然后使用 ctrl+shift kbd>+输入):

=SMALL(IFERROR(CHOOSE(COLUMN(INDIRECT("C1:C12",FALSE)),Sheet1!A1:A73,Sheet2!A1:A70,Sheet3!A1:A79,Sheet4!A1:A58,Sheet5!A1:A51,Sheet6!A1:A94,Sheet7!A1:A50,Sheet8!A1:A89,Sheet9!A1:A75,Sheet10!A1:A89,Sheet11!A1:A70,Sheet12!A1:A94),FALSE),ROW(INDIRECT("1:"&COUNT(Sheet1!A1:A73,Sheet2!A1:A70,Sheet3!A1:A79,Sheet4!A1:A58,Sheet5!A1:A51,Sheet6!A1:A94,Sheet7!A1:A50,Sheet8!A1:A89,Sheet9!A1:A75,Sheet10!A1:A89,Sheet11!A1:A70,Sheet12!A1:A94))))

我将使用一个较小的版本(2 列)来解释它是如何工作的:

=SMALL(IFERROR(CHOOSE(COLUMN(A1:B1),A1:A73,C1:C70),FALSE),ROW(1:143))

首先,COLUMN(A1:B1) 返回一个介于 1 和 2 之间的整数的水平数组。将其传递给具有两个单列范围的 CHOOSE 函数会从 A1:A73C1:C70 创建一个 73 x 2 数组(而不是创建交错数组时,第二列的最后三个值将用#NA填充。

IFERROR 包装结果,将三个#NA 值转换为FALSE(否则SMALL 将返回错误)。

接下来,ROW(1:143) 返回一个 1 到 143 之间的整数的垂直数组。将 73 x 2 数组和 1 到 143 之间的整数数组传递给 SMALL 将返回一个 143 x 1 数组(垂直)排序后的值(三个 FALSE 值被忽略)。

INDIRECT注意事项:以这种方式使用INDIRECT,即使删除行/列,公式也会稳定;但是,它也会使公式变得不稳定,这将导致每次工作簿发生更改时都会重新计算它,这可能会大大减慢速度。另一种选择是INDEX(例如ROW(A1:INDEX(A:A,COUNT(...))),它可能会受到行/列删除的影响,但不是易变的。

【讨论】:

这部分似乎不起作用:“将其传递给具有两个单列范围的 CHOOSE 函数会创建一个 73 x 2 数组”。似乎并非如此,它正在创建一个由两个元素组成的水平数组,仅对应于 73x2 数组的第一行。 @MaziarRezaei 你是对的。答案中有几个错误。我修复了错误并稍微简化了公式。 非常感谢!我确实解决了 Column(xxx) 调用的问题,但使用的是谷歌表格,我只是在 Excel 中尝试过。这似乎是谷歌表格中的一个错误。在 Excel 中,它按预期工作。 在 Google 表格中,创建 73x2 数组的公式等效于使用大括号语法。这里是:=A1:A73,C1:C70【参考方案3】:

如果您不介意手动操作,这适用于数字和非数字 ID:

    使用 Ctrl-C + Ctrl-V 手动堆叠列 转到数据选项卡 --> 过滤器 --> 高级过滤器 --> 仅勾选唯一记录 --> 选择您的副本到位置

这个简单的两步过程将为您提供两列的唯一联合。显然,列数越多,VBA 方法的实用性就越高。

【讨论】:

必须注意那些 7 岁的问题。 :) 希望 Stan 现在已经解决了这个问题 - 过去六年没有出现在网站上。

以上是关于多列并集为一列的主要内容,如果未能解决你的问题,请参考以下文章

EXCEL中如何把一列数据变为多列?

Pandas选择一列或者多列数据

excel怎么查找多列数据中的相同数据,并导出到新的一列

按多列分组并从 R 中的另一列分配值

关于Oracle中实现单列拆分成多列的技术应用

Hive Query 在 Select 中具有多列并按一列分组