提问人:Stan 提问时间:7/29/2015 最后编辑:pnutsStan 更新时间:11/18/2023 访问量:10942
将多列并合并为一列
Union of multiple columns as one column
问:
您能否建议为有或没有 VBA 的 12 个单独列(位于工作簿中的 12 个不同的 Excel 工作表中)创建联合列的最佳方法是什么?
有很好的手册如何在没有 VBA(使用 MATCH 功能)的情况下为两列执行此操作,但是我不确定如何处理多列的情况。
答:
我认为可以通过数据透视表的多个合并范围来实现。需要列的标签和每张表的多列(可以克隆现有列)。应自动对列表中的重复项进行排序和删除(如果已克隆)。
编辑:
我假设您的 ID 都是数字的(否则,如果没有 VBA,如果不是不可能的话,排序将非常棘手)。您可以修改以下数组公式以满足您的需求(选择一个具有足够行的区域来保存完整的 ID 堆栈,输入公式,然后使用 ++ 提交公式):ctrlshiftenter
=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))
首先,返回一个介于 1 和 2 之间的整数水平数组。将其传递给具有两个单列范围的 CHOOSE 函数会从两个 and 创建一个 73 x 2 的数组(而不是创建交错数组,第二列的最后三个值将填充 )。COLUMN(A1:B1)
A1:A73
C1:C70
#NA
将结果包装起来,将三个值转换为(否则,将返回错误)。IFERROR
#NA
FALSE
SMALL
接下来,返回一个介于 1 和 143 之间的整数垂直数组。将 73 x 2 数组和 1 到 143 之间的整数数组传递给将返回一个 143 x 1 的排序值数组(垂直)(这三个值将被忽略)。ROW(1:143)
SMALL
FALSE
注意:以这种方式使用使公式稳定,即使删除了行/列;但是,它也会使公式不稳定,这将导致每次工作簿发生更改时都要重新计算公式,这可能会大大减慢速度。另一个选项是(例如,,它可能会受到行/列删除的影响,但不是可变的。INDIRECT
INDIRECT
INDEX
ROW(A1:INDEX(A:A,COUNT(...)))
评论
if you don't mind a bit of manual effort, this works for numeric and non numeric IDs:
- Stack columns on top of each other manually using Ctrl-C + Ctrl-V
- Go to Data tab --> Filter --> Advanced Filter --> tick unique records only --> choose your copy to location
This simple two step process would then give you unique union of two columns. Obviously the higher the number of columns, the more the utility of a VBA approach.
评论
SELECT DISTINCT
UNION
ORDER BY