将多个列中的值合并为一个

我有以下数据结构:

数据+预期的结果+我得到的

正如您在J列中看到的,我正在尝试将数据合并到ACEG一列中。

我正在使用这个公式:

=IF(ROW()<=COUNTA($A:$A);INDEX($A:$C;ROW();COLUMN(A1));INDEX($A:$C;ROW()-COUNTA($A:$A)+1;COLUMN(C1))) 

我看到K列中的值。 目前这个公式只合并两列。 如何修改它来合并所有四列?

而如何才能从第5行开始获得这些值?
柱高会不断变化:有时A列有10个值,有时候有2个值。

任何Excel公式或任何VBA代码都可以接受。

有一个相当标准的方法来检索列中的唯一值,但不是多列。 要实现从多个列中检索,您需要将多个公式一起堆叠起来,并将处理传递给连续的列,将先前的公式错误输出。

从多列收集唯一

J5中的数组公式 ¹是,

 =IFERROR(INDEX($A$5:$A$99, MATCH(0, IF(LEN($A$5:$A$99), COUNTIF(J$4:J4, $A$5:$A$99), 1), 0)), IFERROR(INDEX($C$5:$C$99, MATCH(0, IF(LEN($C$5:$C$99), COUNTIF(J$4:J4, $C$5:$C$99), 1), 0)), IFERROR(INDEX($E$5:$E$99, MATCH(0, IF(LEN($E$5:$E$99), COUNTIF(J$4:J4, $E$5:$E$99), 1), 0)), IFERROR(INDEX($G$5:$G$99, MATCH(0, IF(LEN($G$5:$G$99), COUNTIF(J$4:J4, $G$5:$G$99), 1), 0)), "")))) 

我只列入A,C,E和G列,因为您的样本数据只显示B,D,F和H列中的重复项。


¹ 数组公式需要使用Ctrl + Shift + Enter 来完成。 如果input正确,Excel将花括号包括在公式中(例如{} )。 你不要自己input大括号。 一旦正确input第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。 尝试和减less您的全列引用范围更接近代表实际数据的范围。 数组公式将计算周期对数化,所以最好将参考范围缩小到最小。 有关更多信息,请参阅数组公式的示例 。

这个答案是另一种思考你可以用于这种任务的公式的方法。 它达到了@Jeeped所指出的那样,很难在多列中find唯一的值。 我的第一步是创build一个单一的列。

如果你可以住在一个辅助列中,这些公式可能比已经提出的嵌套的IFERROR更容易维护。 乍一看,他们同样难以理解。 另一个好处是,如果所涉及的列数增加,则它可以很好地扩展。

可以使用CHOOSE和一些INDEXmath来构build一组分隔列的单列数组。 诀窍是当给出一个数组作为select参数时, CHOOSE会并排连接不连续的区域。 如果这从相同大小的列开始,那么可以使用除法和math模型将其变成单个列。

范围的图片显示了四组数据,重复的红色。

范围的图片

F2:F31 公式 F2:F31是一个数组公式。 这是将所有的列组合到一个数组中,然后返回到一个列中。 为了强调处理不连续的范围,我select了不按顺序的列。

 =INDEX(CHOOSE({1,2,3,4}, A2:A7,C2:C7,B2:B7,D2:D7), MOD(ROW(1:30)-1, ROWS(A2:A7))+1,INT((ROW(1:30)-1)/ROWS(A2:A7))+1) 

H2的数组公式是一个唯一值的标准公式。 一个例外是,而不是避免像正常的空白,我避免0值。

 =IFERROR(INDEX(F2:F31,MATCH(0,IF(F2:F31=0,1,COUNTIF($H$1:H1,F2:F31)),0)),"") 

关于这种方法的其他一些评论:

  • CHOOSE ,我使用{1,2,3,4} 。 这可以用TRANSPOSE(ROWS(1:4))或任意数量的列代替。
  • 在2个地方也有一个ROWS(A2:A7) ,这可能只是2:71:6或者是用于列大小的任何大小。 我使用了其中一个数据范围,以便简化着色,并强调它需要匹配块的大小。
  • ROW(1:30)用于收集总数的数量。 因为有6*4项目,所以它只需要1:24 ,但是我在testing的时候做了很大的工作。

这种方法肯定存在一些缺点,但是保留在工具箱中可能是一个好方法。 永远不知道什么时候你可能想从不连续的范围中创build一个列。 最大的缺点是,数据列都需要是相同的大小(当然还有帮手列)。

这段代码会做你所问的:

 Sub MoveData() START_ROW = 5 START_COL = 1 STEP_COL = 2 OUTPUT_ROW = 5 OUTPUT_COL = 10 Row = START_ROW Col = START_COL Out_Row = OUTPUT_ROW While Col < OUTPUT_COL While Cells(Row, Col).Value <> "" Cells(Out_Row, OUTPUT_COL).Value = Cells(Row, Col).Value Out_Row = Out_Row + 1 Row = Row + 1 Wend Row = START_ROW Col = Col + STEP_COL Wend 

结束小组