如何使用VBA在excel中重塑数据

如何使用VBA在excel中重塑数据,vba,excel,Vba,Excel,我有一个如下所示的数据集: ID | Date1| Thing1| Date2| Thing2| Date3| Thing3| Date4| Thing4| 1 | a | xx | b | xx | c | xx | d | xx | 2 | e | xx | f | xx | g | xx | h | xx | ID | Date| Thing| 1 | a | x

我有一个如下所示的数据集:

ID   | Date1| Thing1| Date2| Thing2| Date3| Thing3| Date4| Thing4|
1    |  a   |  xx   | b    |   xx  | c    | xx    | d    |  xx   |
2    |  e   |  xx   | f    |   xx  | g    | xx    | h    |  xx   |
ID   | Date| Thing|
 1   |  a  | xx   |
 1   |  b  | xx   |
 1   |  c  | xx   |
 1   |  d  | xx   |
 2   |  e  | xx   |
 2   |  f  | xx   |
 2   |  g  | xx   |
 2   |  h  | xx   |
我想把它改成这样一张长桌子:

ID   | Date1| Thing1| Date2| Thing2| Date3| Thing3| Date4| Thing4|
1    |  a   |  xx   | b    |   xx  | c    | xx    | d    |  xx   |
2    |  e   |  xx   | f    |   xx  | g    | xx    | h    |  xx   |
ID   | Date| Thing|
 1   |  a  | xx   |
 1   |  b  | xx   |
 1   |  c  | xx   |
 1   |  d  | xx   |
 2   |  e  | xx   |
 2   |  f  | xx   |
 2   |  g  | xx   |
 2   |  h  | xx   |
我知道如何在R中做到这一点,但在excel中我真的很困惑

有人能帮我设置一些vba代码吗


提前感谢

有3个问题与您的问题非常相似

我会根据你的情况调整答案,这很容易。您需要的一些细微更改:

  • 根据需要扩展
    rng_all

  • 您不必使用icol、ncols等来扫描每个ID的列,而必须使用icase、NCASE等来扫描案例:

    ncases=(工作表函数CountA(rng\u curr)-1)/2

    icase=1至NCASE的

  • 在循环内更改slighlty代码

  • 为每个案例添加复制第三列的代码


  • 如果非VBA正常,则可以使用。

    有3个问题与您的问题非常相似

    我会根据你的情况调整答案,这很容易。您需要的一些细微更改:

  • 根据需要扩展
    rng_all

  • 您不必使用icol、ncols等来扫描每个ID的列,而必须使用icase、NCASE等来扫描案例:

    ncases=(工作表函数CountA(rng\u curr)-1)/2

    icase=1至NCASE的

  • 在循环内更改slighlty代码

  • 为每个案例添加复制第三列的代码


  • 如果非VBA正常,可以使用。

    这里是我这边的一个变体

    Sub test()
        Dim Key, Dic As Object, cl As Range, Data As Range, i&, n&
        Set Dic = CreateObject("Scripting.Dictionary")
        Dic.CompareMode = vbTextCompare
        i = Cells(Rows.Count, "A").End(xlUp).Row
        n = 1
        Set Data = Range("B2:B" & i & "," & "D2:D" & i & "," & "F2:F" & i & "," & "H2:H" & i)
        Dic.Add "|ID", "Date|Thing"
        For Each cl In Data
            If Cells(cl.Row, "A") <> "" Then
                Dic.Add n & "|" & Cells(cl.Row, "A"), cl.Text & "|" & cl.Offset(, 1).Text
                n = n + 1
            End If
        Next cl
        n = 1
        For Each Key In Dic
            Cells(n, "K") = Split(Key, "|")(1)
            Cells(n, "L") = Split(Dic(Key), "|")(0)
            Cells(n, "M") = Split(Dic(Key), "|")(1)
            n = n + 1
        Next Key
    End Sub
    
    子测试()
    尺寸键,Dic作为对象,cl作为范围,数据作为范围,i&,n&
    设置Dic=CreateObject(“Scripting.Dictionary”)
    Dic.CompareMode=vbTextCompare
    i=单元格(Rows.Count,“A”)。结束(xlUp)。行
    n=1
    设置数据=范围(“B2:B”&i&“,”和“D2:D”&i&“,”和“F2:F”&i&“,”和“H2:H”&i)
    Dic.添加“| ID”、“日期|事物”
    对于数据中的每个cl
    如果单元格(第1行,“A”)“则
    Dic.添加n&“|”和单元格(第1行,“A”)、第1行文本和第1行偏移(,1).Text
    n=n+1
    如果结束
    下一个cl
    n=1
    对于Dic中的每个键
    单元格(n,“K”)=拆分(键“|”)(1)
    单元格(n,“L”)=拆分(Dic(键),“|”)0
    单元格(n,“M”)=拆分(Dic(键),“|”)单元格(1)
    n=n+1
    下一键
    端接头
    
    输出


    这里是我这边的一个变体

    Sub test()
        Dim Key, Dic As Object, cl As Range, Data As Range, i&, n&
        Set Dic = CreateObject("Scripting.Dictionary")
        Dic.CompareMode = vbTextCompare
        i = Cells(Rows.Count, "A").End(xlUp).Row
        n = 1
        Set Data = Range("B2:B" & i & "," & "D2:D" & i & "," & "F2:F" & i & "," & "H2:H" & i)
        Dic.Add "|ID", "Date|Thing"
        For Each cl In Data
            If Cells(cl.Row, "A") <> "" Then
                Dic.Add n & "|" & Cells(cl.Row, "A"), cl.Text & "|" & cl.Offset(, 1).Text
                n = n + 1
            End If
        Next cl
        n = 1
        For Each Key In Dic
            Cells(n, "K") = Split(Key, "|")(1)
            Cells(n, "L") = Split(Dic(Key), "|")(0)
            Cells(n, "M") = Split(Dic(Key), "|")(1)
            n = n + 1
        Next Key
    End Sub
    
    子测试()
    尺寸键,Dic作为对象,cl作为范围,数据作为范围,i&,n&
    设置Dic=CreateObject(“Scripting.Dictionary”)
    Dic.CompareMode=vbTextCompare
    i=单元格(Rows.Count,“A”)。结束(xlUp)。行
    n=1
    设置数据=范围(“B2:B”&i&“,”和“D2:D”&i&“,”和“F2:F”&i&“,”和“H2:H”&i)
    Dic.添加“| ID”、“日期|事物”
    对于数据中的每个cl
    如果单元格(第1行,“A”)“则
    Dic.添加n&“|”和单元格(第1行,“A”)、第1行文本和第1行偏移(,1).Text
    n=n+1
    如果结束
    下一个cl
    n=1
    对于Dic中的每个键
    单元格(n,“K”)=拆分(键“|”)(1)
    单元格(n,“L”)=拆分(Dic(键),“|”)0
    单元格(n,“M”)=拆分(Dic(键),“|”)单元格(1)
    n=n+1
    下一键
    端接头
    
    输出


    使用宏记录器开始。它将记录您手动执行的操作,并将其转换为代码,然后您可以在VBA编辑器中查看这些代码。简单的复制和粘贴就可以了。如果列
    ID
    也被重复,您可以使用公式方法。使用宏记录器开始。它将记录您手动执行的操作,并将其转换为代码,然后您可以在VBA编辑器中查看这些代码。简单的复制和粘贴就可以了。如果列
    ID
    也被重复,您可以使用公式方法。谢谢我会尝试这样的方法谢谢我会尝试这样的方法