多列联合作为一列

时间:2015-07-29 09:32:50

标签: excel vba excel-vba union unpivot

请问您可以建议在有或没有VBA的情况下为12个单独的列(位于工作簿中的12个不​​同Excel工作表中)创建工会列的最佳方法是什么?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

{=TRANSPOSE(SMALL(IFERROR(CHOOSE(COLUMN(1:12),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),(COLUMN(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列)来解释它是如何工作的:

{=TRANSPOSE(SMALL(IFERROR(CHOOSE(COLUMN(1:2),A1:A73,C1:C70),FALSE),(COLUMN(1:143))))

首先,COLUMN(OFFSET($A$1,0,0,,2))返回1到2之间的水平整数数组。将其传递给具有两个单列范围的CHOOSE函数,从A1:A73和{{}}创建一个73 x 2数组。 {1}}(不是创建锯齿状数组,而是使用C1:C70填充第二列的最后三个值。)

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

接下来,SMALL返回1到143之间的水平整数数组。将73 x 2数组和1到143之间的整数数组传递给small将返回单个1 x 143数组(水平)排序后的值,然后转置以返回垂直数组作为输出。