将多列中的值合并为一列

Merge values in multiple columns into one

我有以下数据结构:



正如您在 列 J 中看到的,我正在尝试将数据合并到列 AC[=39= 中的一列中] & E & 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 代码。

此代码将执行您的要求:

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

结束子

有一种相当标准的方法可以从一列而不是多列中检索唯一值。要实现从多列的检索,您需要将多个公式堆叠在一起,并将处理传递给连续的列,一个较早的公式会出错。

J5中的数组公式¹是,

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

我只包含了 A、C、E 和 G 列,因为您的示例数据在 B、D、F 和 H 列中仅显示重复项。


¹ 数组公式需要用Ctrl+Shift+Enter↵。如果输入正确,Excel 会将公式括在大括号中(例如 {})。您不会自己输入大括号。一旦正确输入第一个单元格,就可以像任何其他公式一样向下或向右填充或复制它们。尝试将整列引用减少到更接近代表实际数据范围的范围。数组公式以对数方式消耗计算周期,因此最好将参考范围缩小到最小值。有关详细信息,请参阅 Guidelines and examples of array formulas

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

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

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

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

公式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: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 项,但我在测试时把它变大了。

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

认为你们把事情搞复杂了。只需将数据范围拉入 power query ,select 所有列并反转它们,这会将所有数据放入单个列