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

我有大约5000行数据。 每行有大约20列的数据和一个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 

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

欢迎来到SO / SE! 你有没有尝试过任何解决scheme呢? 如果是,请更新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. 对于RowNum,使用=ROW()
  3. 对于NextRowSameId,请使用=IF([@IdCount]>1,IFERROR(AGGREGATE(15,6,[RowNum]/(([RowNum]>[@RowNum])*([ID]=[@ID])),1),""),"")

然后按alt + f11打开VBA编辑器,插入一个模块,然后input下面的代码

 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 

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

请注意

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