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 ごとに 1 つの行があり、すべてのイベント タイプがタイムスタンプ (時系列順) に従って列に表示されます。

元のテーブルを元に戻すために、マクロが 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 に答える