Excel Vba动态转置为列的行数

时间:2014-11-09 19:25:41

标签: excel vba dynamic transpose

我对vba比较新,发现很难为这个动态范围编写代码。输入数据的日期为2014年7月11日至11月14日14:00,时间为00:00至23:00。我需要以这样的方式转换小时:对于每个日期,我每小时都有值(以列为单位)。如果我不清楚这个问题,请告诉我。提前一百万感谢

输入数据

Date        Hours      Name          %Value
11/07/14    00:00    P4127C11       20   
11/07/14    01:00    P4127C11       30
   .                                
   .                          
11/07/14    23:00    P4127C11       24     
11/08/14    00:00    P4127C11       15    
    .   
    .    
11/11/14    00:00    P4127C11       25      
    .        .         .            .    
    .        .         .            .     
11/11/14    23:00    P4127C11       31 

输出数据

Date       Name      00:00   01:00   02:00 . . .  .   23:00      
11/07/14  P4127C11    20       30      .      . ..  .  24    
11/08/14  P4127C11    15        .      .    .. . . .    .    
   .      
   .     
11/11/14  P4127C11    25        .     .    .          31     

2 个答案:

答案 0 :(得分:0)

这只是一个数据透视表。您可以通过创建一个数据透视表来解决此问题,该数据透视表包含行值中的日期和名称,列值中的时间以及值中最大值%。

答案 1 :(得分:0)

@Nadeem,使用vba解决它的许多方法之一是将数据加载到已定义类型的数组中。看看这段代码,它应该提供一些你可以使用的想法。

Private Type tPivotValues
    sDate As String
    sName As String
    aHour() As String
End Type

Sub q26832297()

Dim i, j As Long
Dim aPivotValues() As tPivotValues
Dim iArrIndex As Integer


    ReDim aPivotValues(0 To 1)

    iArrIndex = 0
    'reading first date of first element
    aPivotValues(iArrIndex).sDate = Sheets(1).Cells(2, 1).Value
    aPivotValues(iArrIndex).sName = Sheets(1).Cells(2, 3).Value
    j = 0
    ReDim aPivotValues(iArrIndex).aHour(0 To 23)

    For i = 2 To Sheets(1).Cells(1, 1).End(xlDown).Row
        'if date in row different than in array element
        If aPivotValues(iArrIndex).sDate <> Sheets(1).Cells(i, 1).Value Then
            iArrIndex = iArrIndex + 1
            aPivotValues(iArrIndex).sDate = Sheets(1).Cells(i, 1).Value
            aPivotValues(iArrIndex).sName = Sheets(1).Cells(i, 3).Value
            'setting hours counter to 0
            j = 0
            ReDim aPivotValues(iArrIndex).aHour(0 To 23)
        End If
        If aPivotValues(iArrIndex).sDate = Sheets(1).Cells(i, 1).Value Then
            aPivotValues(iArrIndex).aHour(j) = Sheets(1).Cells(i, 4).Value
            j = j + 1
        End If
    Next i

    'printing data to different sheet
    For i = LBound(aPivotValues) To UBound(aPivotValues)
        Sheets(2).Cells(i + 1, 1).Value = aPivotValues(i).sDate
        Sheets(2).Cells(i + 1, 2).Value = aPivotValues(i).sName
        For j = LBound(aPivotValues(i).aHour) To UBound(aPivotValues(i).aHour)
            Sheets(2).Cells(i + 1, j + 3).Value = aPivotValues(i).aHour(j)
        Next j
    Next i

End Sub