我对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
答案 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