如何在excel中为每三列拆分一行?

时间:2014-10-08 19:24:12

标签: excel vba vbscript

在Excel中,如何将行拆分为一组列。 A1:G1中的数据应该在第一行,然后A1:C1将与第一行相同,D1:G1应该从第一行的末尾开始。这应该继续,直到第一行中的数据限制为G1

我的数据就像

 A     B       C             D           E  ...       AE           AF          AG            
 1     ab    2013/01/12     2013/02/23    233     2013/02/24    2013/03/11     500
 2     cd    2013/01/12     2013/02/23    233     2013/02/24    2013/03/11     343
 .
 . 
 200  XX     XXXX/XX/XX     XXXX/XX/XX    XX      XXXX/XX/XX    XXXX/XX/XX     XXX   

我需要将其拆分为:

 A              B             C              D            E         
 1              ab          2013/01/12     2013/02/23    233
 .
 .
 1              ab          2013/02/24     2013/03/11    500


 2              cd          2013/01/12     2013/02/23    233 
 .
 .
 2              cd          2013/02/24     2013/03/11    343  
 .
 .

如何在excel中完成,我尝试编写一个vb脚本,但它没有去任何地方。有人可以帮我解决这个问题。

1 个答案:

答案 0 :(得分:0)

好的,所以看起来您有两个具有静态ID和名称的单元格,然后是一系列三个单元格,其显示的格式为DateDateNumber。您希望将前两个单元格右侧的所有内容都转换为重复行。这应该做。

Sub split_and_stack()
    Dim c As Long, r As Long, lc As Long, lr As Long
    Dim ws1 As Worksheet, ws2 As Worksheet
    Set ws1 = ActiveSheet
    Sheets.Add after:=Sheets(Sheets.Count)
    Set ws2 = Sheets(Sheets.Count)
    ws2.Cells(1, 1).Resize(1, 5) = Array("id", "name", "start", "end", "number")
    With ws1
        lr = .Cells(Rows.Count, 1).End(xlUp).Row
        lc = .Cells(1, Columns.Count).End(xlToLeft).Column
        For r = 1 To lr
            For c = 3 To lc Step 3
                ws2.Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Resize(1, 2) = _
                  .Cells(r, 1).Resize(1, 2).Value
                ws2.Cells(Rows.Count, 1).End(xlUp).Offset(0, 2).Resize(1, 3) = _
                  .Cells(r, c).Resize(1, 3).Value
            Next c
        Next r
    End With
End Sub

以下图片可能无法正确显示日期,但您应该了解一般情况。在提供样本数据时,最好不要提供可以转换为 mm / dd / yy dd / mm / yy 的模糊日期。

enter image description here