2012-04-09 83 views
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查询来转换原始表?

回答

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 
+0

出于某种原因,我得到“类型不匹配”的错误运行此宏。 – knarusk 2012-04-09 11:20:00

+0

在哪一行?一种可能性,如果你的ID不是数字,则使用“Dim ID作为Variant”而不是“Long” – 2012-04-09 11:59:58