将多列中的值合并为一列

时间:2015-05-19 14:57:26

标签: excel vba excel-vba excel-formula

我有以下数据结构:

Data+Expected Results+What I get

正如您在列J 中看到的那样,我正在尝试将数据合并到列 A &amp;列中的一列中 C &amp; E &amp; <强“G 即可。

我使用的是这个公式:

=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代码都可以接受。

4 个答案:

答案 0 :(得分:7)

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

Collect Unique from multiple columns

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↵完成。如果输入正确,Excel将公式包装在大括号中(例如 {} )。您不要自己键入大括号。一旦正确进入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。尝试并减少对更接近表示实际数据范围的范围的全列引用。数组公式以对数方式计算计算周期,因此将参考范围缩小到最小值是一种好习惯。有关详细信息,请参阅Guidelines and examples of array formulas

答案 1 :(得分:2)

这个答案是另一种思考可用于此类任务的公式的方法。它得到了@Jeeped的观点,很难在多列中找到唯一值。我的第一步是创建一个列。

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

可以使用CHOOSE和一些INDEX数学来构建一组分离列的单个列数组。诀窍是当给定数组作为选择参数时,CHOOSE将并排连接不连续范围。如果从相同大小的列开始,则可以使用除法和mod数学将其转换为单个列。

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

picture of ranges

F2:F31中的

公式是一个数组公式。这会将所有列组合成一个数组,然后再返回一个列。我没有按顺序选择列,只是为了强调它处理的是不连续的范围。

=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)用于收集的总项目数。它实际上只需1:24,因为有6*4项,但我在测试时做得很大。

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

答案 2 :(得分:1)

此代码将按您的要求执行:

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

End Sub

答案 3 :(得分:-3)

想想你们正在把事情弄复杂。只需将数据范围拉入幂查询中,选择所有列并将其取消旋转,这会将所有数据合并到一个列中