我有以下数据结构:
正如您在列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代码都可以接受。
答案 0 :(得分:7)
有一种相当标准的方法可以从列中检索唯一值,但不能从多列中检索。要实现从多个列的检索,您需要将多个公式一起堆叠,并将处理传递给连续的列,前面的公式错误输出。
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数学将其转换为单个列。
范围图片显示四组重复数据为红色的数据。
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))
或您拥有的任意数量的列。ROWS(A2:A7)
,这可能只是2:7
或1: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)
想想你们正在把事情弄复杂。只需将数据范围拉入幂查询中,选择所有列并将其取消旋转,这会将所有数据合并到一个列中