我目前在 Excel 中有一个原始数据表,它总结了给定参与的阶段 A、B 和 C 的状态。一些参与可能没有所有 3 个阶段的数据。
Row| EngagementID | A_date | A_status | B_date | B_status | C_date | C_status
1 | 201 | 2/2 | Approved | | | |
2 | 201 | | | 3/5 | Approved | |
3 | 201 | | | | | 4/1 | Pending
4 | 203 | 2/12 | Submitted| | | |
5 | 203 | | | 2/20 | Approved | |
6 | 207 | 2/5 | Approved | | | |
我正在尝试将表格展平成如下所示:
Row| EngagementID | A_date | A_status | B_date | B_status | C_date | C_status
1 | 201 | 2/2 | Approved | 3/5 | Approved | 4/1 | Pending
2 | 203 | 2/12 | Submitted| 2/20 | Approved | |
3 | 207 | 2/5 | Approved | | | |
问题:多个实例
但是,在某些情况下,同一个 EngagementID 有多个实例。例如,它可能具有以下内容:
Row| EngagementID | A_date | A_status | B_date | B_status | C_date | C_status
1 | 201 | 2/2 | Approved | | | |
2 | 201 | | | 3/5 | Approved | |
3 | 201 | | | 3/18 | Pending | |
4 | 201 | | | | | 5/20 | Pending
5 | 201 | | | | | 5/15 | Submitted
我试图使 VBA 足够灵活,以便在这些情况下,表格将转换为
Row| EngagementID | A_date | A_status | B_date | B_status | C_date | C_status
1 | 201 | 2/2 | Approved | 3/5 | Approved | 5/20 | Pending
2 | 201 | 2/2 | Approved | 3/18 | Pending | 5/15 | Submitted
我能够使用以下 VBA 代码解决单实例方面的问题:
Private Sub test()
Dim R As Long
Dim i As Integer
i = 1
R = 2
Count = 0
Do While Not IsEmpty(Range("A" & R))
If Cells(R, 1).Value = Cells(R + 1, 1).Value Then
Count = Count + 1
Else
i = 1
Do While i <= Count
Cells(R - Count, 2 + (2 * i)).Value = Cells(R - Count + i, 2 + (2 * i))
Cells(R - Count, 3 + (2 * i)).Value = Cells(R - Count + i, 3 + (2 * i))
i = i + 1
Loop
i = 1
Do While i <= Count
Rows(R - Count + i).Delete
i = i + 1
R = R - 1
Loop
Count = 0
End If
R = R + 1
Loop
End Sub
但是,这并不能说明多个实例。 任何关于我可以在何处调整 VBA 以适应这种“多实例”场景的想法都将不胜感激。谢谢!
最佳答案
您可以使用 Power Query 轻松处理此问题。这是一个插件,您可以免费获得并在 Excel 2010+ 中激活(默认情况下在 Excel 2016 中称为获取和转换)。您可以在那里直接连接您的源并根据需要编辑您的数据。对于您的特定情况,请按照以下步骤操作:
关于mysql - 如何使用 VBA 来展平 Excel 中数据在行之间拆分的表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49018165/