将多列合并为一列

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

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

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

vba excel union unpivot
4个回答
1
投票

我认为可以通过数据透视表的多个合并范围来实现。需要为列添加标签,并且每张纸需要多个列(可以克隆现有的标签)。应该自动排序并从列表中删除重复项(如果是克隆的)。


1
投票

编辑:

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

=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:A73
C1: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(...)))
,它可能会受到行/列删除的影响,但不是易失性的。


0
投票

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

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

这个简单的两步过程将为您提供两列的唯一并集。显然,列数越多,VBA 方法的效用就越大。


0
投票
© www.soinside.com 2019 - 2024. All rights reserved.