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

Vba 将多列中的值合并为一列,vba,excel,excel-formula,Vba,Excel,Excel Formula,我有以下数据结构: 正如您在列J中看到的,我正在尝试将列A和列C和列E和列G中的数据合并到一列中 我使用的公式是: =IF(ROW()<=COUNTA($A:$A);INDEX($A:$C;ROW();COLUMN(A1));INDEX($A:$C;ROW()-COUNTA($A:$A)+1;COLUMN(C1))) =IF(ROW()此代码将按您的要求执行: Sub MoveData() START_ROW = 5 START_COL = 1 STEP_COL = 2 OUTPUT

我有以下数据结构:



正如您在列J中看到的,我正在尝试将列A列C列E列G中的数据合并到一列中

我使用的公式是:

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

=IF(ROW()此代码将按您的要求执行:

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
Sub-MoveData()
起始行=5
START_COL=1
步骤2
输出_行=5
输出值=10
行=开始行
Col=开始
输出行=输出行
而Col

End Sub

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

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列中只显示了重复项



imk_数组公式需要使用Ctrl+Shift+Enter完成↵. 如果输入正确,Excel将公式用大括号括起来(例如{})。您自己没有键入大括号。正确输入第一个单元格后,可以像任何其他公式一样向下或向右填充或复制大括号。请尝试将整列引用减少到更接近表示实际数据范围的范围。数组公式以对数方式消耗计算周期,因此这是一种很好的做法e将引用范围缩小到最小值。有关更多信息,请参阅。

此答案是考虑可用于此类任务的公式的另一种方式。@Jeeped指出,很难在多个列中找到唯一值。然后,我的第一步是创建单个列

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

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

范围图片显示了四组数据,其中重复数据被涂成红色

F2:F31
中的Formula是一个数组公式。它将所有列组合成一个数组,然后再返回到单个列中。我按顺序选择列,只是为了强调它正在处理一个不连续的范围

=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)),"")
关于此方法的其他几点意见:

  • 选择
    中,我使用的是
    {1,2,3,4}
    。这可以替换为
    转置(行(1:4))
    或任何列数
  • 还有一个
    行(A2:A7)
    位于两个位置,可以是
    2:7
    1:6
    或列大小使用的任何大小。我使用了其中一个数据范围,以便简化着色,并强调它需要匹配块的大小
  • 行(1:30)
    用于收集的项目总数。它实际上只需要
    1:24
    ,因为有
    6*4
    项目,但我在测试时做得很大

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

我想你们把这件事弄得很复杂。只需将数据范围拉到power query中,选择所有列并将其解压,这将把所有数据带到一个列中

你所说的“合并”是什么意思?是在该行上获得第一个非空结果(a、c、e和g列)?这很好地回答了这个问题。但是如果你有重叠的列表,并且想要保持顺序,你可以使用我在这里概述的方法合并成对的列,然后合并结果——我承认有点麻烦。这是一个漂亮的公式。关于多列困难的观点,我继续添加了一个答案,它构建了一个单独的列表首先是e列,然后在该列上运行常规公式。您可以用一个辅助列替换嵌套较少的公式。我尝试了此操作,但我甚至无法模拟您的结果。是因为我的分隔符是;而不是“,”这会影响choose函数吗?但是,我用分号替换了所有逗号。但是没有成功。@Mpondomise,对不起,甚至没有注意到上面的不同分隔符。
choose
应该采用行数组。如果要删除那里的分隔符,只需使用
transpose(行(1:4))
而不是
{1,2,3,4}
,它将返回相同的数组。
ROW()
通常返回一个列数组,然后
TRANSPOSE
将其翻转。请修改您的答案,以便我能明白您的意思吗?我可能会错误地复制它。感谢公式是:
=INDEX(选择(转置(行(1:4)),A2:A7,C2:C7,B2:B7,D2:D7),MOD(行(1:30)-第1行(A2:A7))+