Vba 将多列合并为一列

Vba 将多列合并为一列,vba,excel,union,unpivot,Vba,Excel,Union,Unpivot,您能告诉我,在有或没有VBA的工作簿中,为12个不同Excel工作表中的12个独立列创建联合列的最佳方法是什么 有一些很好的手册,说明如何在不使用VBA的情况下使用MATCH函数对两列进行匹配,但是我不确定如何处理多列的情况。我认为使用数据透视表可以实现。需要为列添加标签,并且每个工作表中有多个列可以克隆现有列。如果克隆,则应自动排序并从列表中删除重复项。我假设您的ID都是数字的,否则,如果没有VBA,排序将非常困难。您可以修改以下数组公式以满足需要选择一个具有足够行的区域以容纳整个ID堆栈,输

您能告诉我,在有或没有VBA的工作簿中,为12个不同Excel工作表中的12个独立列创建联合列的最佳方法是什么


有一些很好的手册,说明如何在不使用VBA的情况下使用MATCH函数对两列进行匹配,但是我不确定如何处理多列的情况。

我认为使用数据透视表可以实现。需要为列添加标签,并且每个工作表中有多个列可以克隆现有列。如果克隆,则应自动排序并从列表中删除重复项。

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

我将使用较小的第2版专栏来解释它的工作原理:

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

使用IFERROR包装结果以将三个NA值转换为FALSE,否则,SMALL将返回错误


接下来,COLUMN1:2返回1到143之间的整数的水平数组。将73 x 2数组和介于1和143之间的整数数组传递给small将返回一个1 x 143数组,该数组水平排列排序后的值,然后将其转置以返回垂直数组作为输出。

能否给出源数据的示例以及希望得到的结果?我有12张表,每个都包含一列中项目的编号ID。我想有一个单独的工作表,它将创建一个列,其中包含来自单独工作表的所有单个项目ID列的并集,可能是升序。非常感谢。不会从不同的工作表聚合不同的范围。您需要循环浏览工作表并将列数据收集到一个集中的位置,然后进行重复数据消除和排序。我认为您可以选择编写VBA宏,将每个源工作表中适当数量的单元格复制并粘贴到目标工作表中的一列,然后对该列中的重复项进行排序和删除,或b将每个源范围定义为Excel表,然后通过Get External Data命令使用MS Query,并使用SELECT DISTINCT、UNION和ORDER BY手工编写SQL查询,以返回所需的数据。
{=TRANSPOSE(SMALL(IFERROR(CHOOSE(COLUMN(1:2),A1:A73,C1:C70),FALSE),(COLUMN(1:143))))