![]()
Sub DataTest_V4() Dim vT, v, vv, vMin, vMax Dim i As Long, d As Object Dim t As Double t = Timer vT = Range("Transactions!A1").CurrentRegion.Value2 Set d = CreateObject("Scripting.Dictionary") With Worksheets("Output") .Cells(1, 1).CurrentRegion.Offset(1).Clear 'Item and Description Transactions For i = 2 To UBound(vT) d.Item(vT(i, 1)) = vT(i, 2) Next i .Cells(2, 1).Resize(d.Count) = Application.Transpose(d.keys) .Cells(2, 2).Resize(d.Count) = Application.Transpose(d.items) d.RemoveAll 'Quantity Transactions For i = 2 To UBound(vT) d.Item(vT(i, 1)) = d.Item(vT(i, 1)) + vT(i, 4) Next i .Cells(2, 3).Resize(d.Count) = Application.Transpose(d.items) v = d.items d.RemoveAll 'First Issue Date Transactions For i = 2 To UBound(vT) If IsEmpty(d(vT(i, 1))) Then d.Item(vT(i, 1)) = vT(i, 3) Else d.Item(vT(i, 1)) = WorksheetFunction.Min(d.Item(vT(i, 1)), vT(i, 3)) End If Next i .Cells(2, 4).Resize(d.Count) = Application.Transpose(d.items) d.RemoveAll 'Minimum Cost Transactions For i = 2 To UBound(vT) If IsEmpty(d(vT(i, 1))) Then d.Item(vT(i, 1)) = vT(i, 6) Else d.Item(vT(i, 1)) = WorksheetFunction.Min(d.Item(vT(i, 1)), vT(i, 6)) End If Next i vMin = d.items .Cells(2, 5).Resize(d.Count) = Application.Transpose(d.items) d.RemoveAll 'Maximum Cost Transactions For i = 2 To UBound(vT) If IsEmpty(d(vT(i, 1))) Then d.Item(vT(i, 1)) = vT(i, 6) Else d.Item(vT(i, 1)) = WorksheetFunction.Max(d.Item(vT(i, 1)), vT(i, 6)) End If Next i vMax = d.items .Cells(2, 6).Resize(d.Count) = Application.Transpose(d.items) d.RemoveAll 'Total Cost Transactions For i = 2 To UBound(vT) d.Item(vT(i, 1)) = d.Item(vT(i, 1)) + vT(i, 7) Next i vv = d.items d.RemoveAll 'Average Cost Transactions For i = LBound(v) To UBound(v) If v(i) = 0 Then d.Item(i + 1) = 0 Else d.Item(i + 1) = vv(i) / v(i) End If Next i .Cells(2, 7).Resize(d.Count) = Application.Transpose(d.items) d.RemoveAll 'Percent Change For i = LBound(vMin) To UBound(vMin) If vMin(i) > 0 Then vMin(i) = (vMax(i) - vMin(i)) / vMin(i) Next i .Cells(2, 8).Resize(UBound(vMin) + 1) = Application.Transpose(vMin) With .UsedRange .Columns("A:B").NumberFormat = "@" .Columns("C").NumberFormat = "#,##0" .Columns("D").NumberFormat = "d/m/yyyy" .Columns("E:G").NumberFormat = "$* #,##0.00" .Columns("H").NumberFormat = "0.0%" End With End With MsgBox Timer - t End Sub
Bookmarks