Option Explicit
Private Type ReportLine
sBSC As String
sEvent As String
sNode As String
dtTotTime As Date
End Type
Sub DK_report()
Dim lLastRow As Long
Dim rngData As Range
Dim vaLineData() As ReportLine
Dim lRowNum As Long
Dim bProcessed As Boolean
Dim lLineId As Long
Dim lRecordCount As Long
Dim wksReport As Worksheet
Dim rngOutput As Range
'Set a reference to the source data
With ThisWorkbook.Worksheets("Results")
lLastRow = .Range("A65536").End(xlUp).Row
Set rngData = .Range(.Cells(2, 1), .Cells(lLastRow, 8))
End With
ReDim vaLineData(0)
With rngData
For lRowNum = 1 To .Rows.Count
'Assume we have not yet processed this node
bProcessed = False
'Loop through the processed nodes..
For lLineId = LBound(vaLineData) To UBound(vaLineData)
'..Looking for a match to the current row
If vaLineData(lLineId).sNode = .Cells(lRowNum, 7) Then
'..If a match is found
'record that and stop looping
bProcessed = True
Exit For
End If
Next lLineId
'For New nodes, record the required values
If Not bProcessed Then
vaLineData(UBound(vaLineData)).sBSC = .Cells(lRowNum, 1)
vaLineData(UBound(vaLineData)).sEvent = .Cells(lRowNum, 2)
vaLineData(UBound(vaLineData)).sNode = .Cells(lRowNum, 7)
vaLineData(UBound(vaLineData)).dtTotTime = Application.WorksheetFunction.SumIf(.Columns(7), .Cells(lRowNum, 7), .Columns(8))
'And increase the size of the array
ReDim Preserve vaLineData(UBound(vaLineData) + 1)
End If
Next lRowNum
End With
'Remove the unused record from the array
ReDim Preserve vaLineData(UBound(vaLineData) - 1)
'How many line in the report?
lRecordCount = UBound(vaLineData) - LBound(vaLineData) + 1
'Add a new sheet
Set wksReport = ThisWorkbook.Worksheets.Add
Application.ScreenUpdating = False
With wksReport
.Move after:=ThisWorkbook.Worksheets(ThisWorkbook.Worksheets.Count)
.Name = "Report- " & Format(Now(), "yy-mm-dd hh,mm,ss")
.Range("A1").Value = "BCS"
.Range("B1").Value = "Event Type"
.Range("C1").Value = "Node"
.Range("D1").Value = "Total"
.Range("E1").Value = "Total (Minutes)"
.Range("D:D").NumberFormat = "hh:mm:ss"
'Loop through the array, writing the value to the report
For lRowNum = 2 To lRecordCount + 1
.Cells(lRowNum, 1) = vaLineData(lRowNum - 2).sBSC
.Cells(lRowNum, 2) = vaLineData(lRowNum - 2).sEvent
.Cells(lRowNum, 3) = vaLineData(lRowNum - 2).sNode
.Cells(lRowNum, 4) = vaLineData(lRowNum - 2).dtTotTime
.Cells(lRowNum, 5) = CInt(vaLineData(lRowNum - 2).dtTotTime * 60 * 24)
Next lRowNum
.Columns("A:E").AutoFit
End With
Application.ScreenUpdating = True
Set wksReport = Nothing
End Sub