我有大约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
每行中有更多列,因此每个粘贴可以查找第一个可用的空白列吗?
答案 0 :(得分:0)
欢迎来到SO / SE!你有没有尝试过任何解决方案呢?如果是,请更新OP以及说明。尝试以下步骤,希望他们能为你工作。我已使用ctrl
+ t
将以下内容格式化为数据表,但如果您愿意,可以将公式转换为R1C1
+----+-----------+-------+-------+-------+-------+---------+--------+---------------+
| 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 | |
+----+-----------+-------+-------+-------+-------+---------+--------+---------------+
=COUNTIFS([ID],[@ID])
=ROW()
=IF([@IdCount]>1,IFERROR(AGGREGATE(15,6,[RowNum]/(([RowNum]>[@RowNum])*([ID]=[@ID])),1),""),"")
然后按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
进行撤消。希望这可以帮助。如果成功/失败请回复。祝你好运!