0

我有一张看起来像这样的桌子

ID Event_A Event_B Event_C
1   01-01
1   01-02 
1           01-05
2   01-02
2                   01-03
3   01-03
3   01-04
3           01-06
3                   01-08

我需要这样的输出

ID Event_1 Event_2 Event_3 Event_4
1   A       A       B
2   A       C
3   A       A       B       C

所以基本上每个 ID 都有一行,并且所有事件类型根据它们的时间戳(时间顺序)列在列中。

谁能建议宏应该如何看起来像 OR sql 查询来翻转原始表?

4

1 回答 1

0

这是重新格式化数据的 VBA 例程:

  1. 假设源数据在活动工作表中,从A1
  2. 将结果放在活动工作表上,开始于F1- 调整以满足您的需求

Sub SummariseList()
    Dim rSrc As Range
    Dim rDst As Range
    Dim vSrc As Variant
    Dim vDst() As Variant
    Dim srcCol As Long, srcRow As Long
    Dim dstCol As Long, dstRow As Long
    Dim ID As Long
    Dim i As Long

    Set rSrc = Range([A1].End(xlToRight).Offset(1, 0), [A2].End(xlDown))
    vSrc = rSrc

    Set rDst = [F2]

    ' Count IDs and events '
    dstRow = 1
    dstCol = 1
    i = 1
    For srcRow = 2 To UBound(vSrc, 1)
        If vSrc(srcRow, 1) = vSrc(srcRow - 1, 1) Then
            i = i + 1
        Else
            dstRow = dstRow + 1
            If dstCol < i Then dstCol = i
            i = 1
        End If
    Next

    If dstCol < i Then dstCol = i
    ReDim vDst(1 To dstRow, 1 To dstCol + 1)

    ' Output table labels '
    rDst.Offset(-1, 0) = "ID"
    For i = 1 To dstCol
        rDst.Offset(-1, i) = "Event_" & i
    Next

    ' Create output data '  
    ID = vSrc(1, 1)
    vDst(1, 1) = ID
    dstRow = 1
    dstCol = 2
    For srcRow = 1 To UBound(vSrc, 1)
        If vSrc(srcRow, 1) <> ID Then
            ' update vDst '  
            ID = vSrc(srcRow, 1)
            dstCol = 2
            dstRow = dstRow + 1
            vDst(dstRow, 1) = ID
        End If
        For srcCol = 2 To UBound(vSrc, 2)
            If vSrc(srcRow, srcCol) <> "" Then
                vDst(dstRow, dstCol) = Chr(srcCol + 63)
                dstCol = dstCol + 1
                Exit For
            End If
        Next
    Next

    ' Place result on sheet '
    rDst.Resize(dstRow, dstCol - 1) = vDst

End Sub
于 2012-04-09T10:05:23.480 回答