将行和粘贴复制到最后一列的右侧

时间:2015-08-05 07:08:22

标签: excel excel-formula

我有大约5,000行数据。每行包含大约20列的数据和ID号。有些ID号在某些行上重复,因为它们是相关的。我需要将具有相同ID号的行中的数据放到另一张表上的一行中。

有:

ID    Date      Data1  Data2  Data3   Data4
3     4/1/2012    6      12    9        7
3     4/2/2012    5      11    6        1
26    5/12/2014   3       9    5        4

需要:

       Date      Data1  Data2  Data3  Data4  Date     Data1  Data2  Data3  Data4
3     4/1/2012    6      12    9        7    4/2/2012    5      11    6        1  
26    5/12/2014   3       9    5        4

每行中有更多列,因此每个粘贴可以查找第一个可用的空白列吗?

1 个答案:

答案 0 :(得分:0)

欢迎来到SO / SE!你有没有尝试过任何解决方案呢?如果是,请更新OP以及说明。尝试以下步骤,希望他们能为你工作。我已使用ctrl + t将以下内容格式化为数据表,但如果您愿意,可以将公式转换为R1C1

第1步:添加3个辅助列

+----+-----------+-------+-------+-------+-------+---------+--------+---------------+
| ID |   Date    | Data1 | Data2 | Data3 | Data4 | IdCount | RowNum | NextRowSameId |
+----+-----------+-------+-------+-------+-------+---------+--------+---------------+
|  3 | 5/12/2016 |     3 |     4 |     5 |       |       3 |      3 |             3 |
|  3 | 4/1/2012  |     6 |    12 |     9 |     7 |       3 |      4 |               |
| 26 | 5/12/2014 |     3 |     9 |     5 |     4 |       1 |      5 |               |
+----+-----------+-------+-------+-------+-------+---------+--------+---------------+
  1. 对于IdCount,请使用=COUNTIFS([ID],[@ID])
  2. for RowNum,请使用=ROW()
  3. 对于NextRowSameId,请使用=IF([@IdCount]>1,IFERROR(AGGREGATE(15,6,[RowNum]/(([RowNum]>[@RowNum])*([ID]=[@ID])),1),""),"")
  4. 然后按alt + f11打开VBA编辑器,插入模块,然后输入以下代码

    Sub sanitize()
        Dim NextRow As Range, RngTxt As String, NextRowNum As Integer
        For Each c In Range("data[IdCount]")
    ResetInnerLoop:
            If c.Value > 1 Then
                NextRowNum = c.Offset(0, 2).Value
                RngTxt = "A" & CStr(NextRowNum) & ":F" & CStr(NextRowNum)
                Range(RngTxt).Cut
                c.Offset(0, 0).Select
                ActiveCell.End(xlToRight).Select
                ActiveSheet.Paste
                Application.CutCopyMode = False
                Calculate
                If c.Value > 1 Then GoTo ResetInnerLoop
            End If
        Next c
        MsgBox "Success"
    End Sub
    

    编辑宏(RngTxt = "A" & CStr(NextRowNum) & ":F" & CStr(NextRowNum))的第7行以匹配您的特定表(而不是:F,使用最后一个数据列)。这将为您留下一些空行,但可以使用过滤器和放大器轻松删除这些行。删除。

    请注意

    在运行宏之前,您应该制作工作簿的副本,因为在运行宏之后无法使用ctrl + z进行撤消。希望这可以帮助。如果成功/失败请回复。祝你好运!