将多列中的值合并为一列
Merge values in multiple columns into one
我有以下数据结构:
正如您在 列 J 中看到的,我正在尝试将数据合并到列 A 和 C[=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:7
或 1:6
或用于列大小的任何大小。我使用了其中一个数据范围,以便简化着色并强调它需要匹配块的大小。
- 而
ROW(1:30)
用于收集的物品总数。它真的只需要 1:24
因为有 6*4
项,但我在测试时把它变大了。
这种方法肯定有一些缺点,但保留在工具箱中可能是一个很好的技巧。永远不知道什么时候您可能想要从不连续的范围中创建一列。最大的缺点是数据列都需要具有相同的大小(当然还有辅助列)。
认为你们把事情搞复杂了。只需将数据范围拉入 power query ,select 所有列并反转它们,这会将所有数据放入单个列
我有以下数据结构:
正如您在 列 J 中看到的,我正在尝试将数据合并到列 A 和 C[=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:7
或1:6
或用于列大小的任何大小。我使用了其中一个数据范围,以便简化着色并强调它需要匹配块的大小。 - 而
ROW(1:30)
用于收集的物品总数。它真的只需要1:24
因为有6*4
项,但我在测试时把它变大了。
这种方法肯定有一些缺点,但保留在工具箱中可能是一个很好的技巧。永远不知道什么时候您可能想要从不连续的范围中创建一列。最大的缺点是数据列都需要具有相同的大小(当然还有辅助列)。
认为你们把事情搞复杂了。只需将数据范围拉入 power query ,select 所有列并反转它们,这会将所有数据放入单个列