Sub Extract() Dim i As Long, j As Long, m As Long Dim strProject As String Dim RDate As Date Dim RVal As Single Dim BlnProjExists As Boolean With Sheets("Enhancements").Range("B3") For i = 1 To .CurrentRegion.Rows.Count - 1 For j = 0 To 13 .Offset(i, j) = "" Next j Next i End With With Sheets("AllData").Range("E3") For i = 1 To .CurrentRegion.Rows.Count - 1 strProject = .Offset(i, 0) RDate = .Offset(i, 3) RVal = .Offset(i, 4) If InStr(.Offset(i, 0), "Enhancements") > 0 Then strProject = .Offset(i, 0) ElseIf InStr(.Offset(i, 0), "OVH") > 0 And RVal > 0 Then strProject = .Offset(i, -1) Else GoTo NextLoop End If With Sheets("Enhancements").Range("B3") If .CurrentRegion.Rows.Count = 1 Then .Offset(1, 0) = strProject j = 1 Else BlnProjExists = False For j = 1 To .CurrentRegion.Rows.Count - 1 If .Offset(j, 0) = strProject Then BlnProjExists = True Exit For End If Next j If BlnProjExists = False Then .Offset(j, 0) = strProject End If End If Select Case Format(RDate, "mmm yy") Case "Apr 13" m = 1 Case "May 13" m = 2 Case "Jun 13" m = 3 Case "Jul 13" m = 4 Case "Aug 13" m = 5 Case "Sep 13" m = 6 Case "Oct 13" m = 7 Case "Nov 13" m = 8 Case "Dec 13" m = 9 Case "Jan 14" m = 10 Case "Feb 14" m = 11 Case "Mar 14" m = 12 End Select .Offset(j, m) = .Offset(j, m) + RVal End With NextLoop: Next i End With End Sub If InStr(.Offset(i, 0), "Enhancements") > 0 Then strProject = .Offset(i, 0) ElseIf InStr(.Offset(i, 0), "OVH") > 0 And RVal > 0 Then strProject = .Offset(i, -1) Else GoTo NextLoop End If With Sheets("Enhancements").Range("B3") If .CurrentRegion.Rows.Count = 1 Then .Offset(1, 0) = strProject j = 1 Else Sub HTH() Dim rLookup As Range, rFound As Range Dim lLastRow As Long, lRow As Long Dim lMonthIndex As Long, lProjectIndex As Long Dim vData As Variant, vMonths As Variant Dim iLoop As Integer Dim vbDict As Object With Worksheets("AllData") Set rLookup = .Range("E3", .Cells(Rows.Count, "E").End(xlUp)) Set rFound = .Range("E3") End With Set vbDict = CreateObject("Scripting.Dictionary") vMonths = Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) For iLoop = 0 To 1 lRow = 0: lLastRow = 3 vbDict.RemoveAll: ReDim vData(rLookup.Count, 13) Do Set rFound = Worksheets("AllData").Cells.Find(Array("Enhancements", "OVH")(iLoop), _ rFound, , , xlByRows, xlNext, False) If rFound Is Nothing Then Exit Do If rFound.Row <= lLastRow Then Exit Do lMonthIndex = WorksheetFunction.Match(Month(CDate(rFound.Offset(, 4).Value)), vMonths, False) If vbDict.exists(rFound.Offset(, -iLoop).Value) Then lProjectIndex = vbDict.Item(rFound.Value) vData(lProjectIndex, lMonthIndex) = _ vData(lProjectIndex, lMonthIndex) + rFound.Offset(, 4).Value Else vbDict.Add rFound.Offset(, -iLoop).Value, lRow vData(lRow, 0) = rFound.Offset(, -iLoop).Value vData(lRow, lMonthIndex) = rFound.Offset(, 4).Value lRow = lRow + 1 End If lLastRow = rFound.Row Loop If iLoop = 0 Then With Worksheets("Enhancements") .Range("B4:O" & Rows.Count).ClearContents .Range("B4").Resize(vbDict.Count + 1, 13).Value = vData End With Else With Worksheets("Overheads") .Range("B4:O" & Rows.Count).ClearContents .Range("B4").Resize(vbDict.Count + 1, 13).Value = vData End With End If Next iLoop End Sub Sub HTH() Dim rLookup As Range, rFound As Range Dim lLastRow As Long, lRow As Long Dim lMonthIndex As Long, lProjectIndex As Long Dim vData As Variant, vMonths As Variant Dim iLoop As Integer Dim vbDict As Object '// Get the projects range to loop through With Worksheets("AllData") Set rLookup = .Range("E3", .Cells(Rows.Count, "E").End(xlUp)) Set rFound = .Range("E3") End With '// Use a latebinded dictionary to store the project names. Set vbDict = CreateObject("Scripting.Dictionary") '// Create an array of the months to get the correct columns. Instead of your select case method vMonths = Array(4, 5, 6, 7, 8, 9, 10, 11, 12, 1, 2, 3) '// Loop through both search requirements For iLoop = 0 To 1 '// Set the counters - lLastRow is used to make sure the loop is not never ending. lRow = 0: lLastRow = 3 '// Clear the dictionary and create the projects array. vbDict.RemoveAll: ReDim vData(rLookup.Count, 13) Do '// Search using the criteria requried Set rFound = Worksheets("AllData").Cells.Find(Array("Enhancements", "OVH")(iLoop), _ rFound, , , xlByRows, xlNext, False) '// Make sure something was found and its not a repeat. If rFound Is Nothing Then Exit Do If rFound.Row <= lLastRow Then Exit Do '// Get the correct month column using our months array and the project date. lMonthIndex = WorksheetFunction.Match(Month(CDate(rFound.Offset(, 4).Value)), vMonths, False) '// Check if the project exists. If vbDict.exists(rFound.Offset(, -iLoop).Value) Then '// Yes it exists so add the actuals to the correct project/month. lProjectIndex = vbDict.Item(rFound.Value) vData(lProjectIndex, lMonthIndex) = _ vData(lProjectIndex, lMonthIndex) + rFound.Offset(, 4).Value Else '// No it doesnt exist, create it and then add the actuals to the correct project/month vbDict.Add rFound.Offset(, -iLoop).Value, lRow vData(lRow, 0) = rFound.Offset(, -iLoop).Value vData(lRow, lMonthIndex) = rFound.Offset(, 4).Value '// Increase the project count. lRow = lRow + 1 End If '// Set the last row = the last found row to ensure we dont repeat the search. lLastRow = rFound.Row Loop If iLoop = 0 Then '// Clear the enhancements sheet and populate the cells from the array With Worksheets("Enhancements") .Range("B4:O" & Rows.Count).ClearContents .Range("B4").Resize(vbDict.Count + 1, 13).Value = vData End With Else '// Clear the overheads sheet and populate the cells from the array With Worksheets("Overheads") .Range("B4:O" & Rows.Count).ClearContents .Range("B4").Resize(vbDict.Count + 1, 13).Value = vData End With End If Next iLoop End Sub Sub Extract() Dim cllProjects As Collection Dim wsData As Worksheet Dim wsEnha As Worksheet Dim wsOver As Worksheet Dim rngFind As Range Dim rngFound As Range Dim rngProject As Range Dim arrProjects() As Variant Dim varProjectType As Variant Dim ProjectIndex As Long Dim cIndex As Long Dim dRVal As Double Dim dRDate As Double Dim strFirst As String Dim strProjectFirst As String Dim strProject As String Set wsData = Sheets("AllData") Set wsEnha = Sheets("Enhancements") Set wsOver = Sheets("Overheads") wsEnha.Range("B4:O" & Rows.Count).ClearContents wsOver.Range("B4:O" & Rows.Count).ClearContents With wsData.Range("E4", wsData.Cells(Rows.Count, "E").End(xlUp)) If .Row < 4 Then Exit Sub 'No data On Error Resume Next For Each varProjectType In Array("Enhancements", "OVH") Set cllProjects = New Collection ProjectIndex = 0 ReDim arrProjects(1 To WorksheetFunction.CountIf(.Cells, "*" & varProjectType & "*"), 1 To 14) Set rngFound = .Find(varProjectType, .Cells(.Cells.Count), xlValues, xlPart) If Not rngFound Is Nothing Then strFirst = rngFound.Address Do strProject = vbNullString dRDate = wsData.Cells(rngFound.Row, "H").Value2 dRVal = wsData.Cells(rngFound.Row, "I").Value2 If varProjectType = "OVH" And dRVal > 0 Then strProject = wsData.Cells(rngFound.Row, "D").Text Set rngFind = Intersect(.EntireRow, wsData.Columns("D")) ElseIf varProjectType = "Enhancements" Then strProject = wsData.Cells(rngFound.Row, "E").Text Set rngFind = .Cells End If If Len(strProject) > 0 Then cllProjects.Add LCase(strProject), LCase(strProject) If cllProjects.Count > ProjectIndex Then ProjectIndex = cllProjects.Count arrProjects(ProjectIndex, 1) = strProject Set rngProject = Intersect(rngFound.EntireRow, Columns(rngFind.Column)) strProjectFirst = rngProject.Address Do If LCase(rngProject.Text) = LCase(strProject) Then dRDate = wsData.Cells(rngProject.Row, "H").Value2 dRVal = wsData.Cells(rngProject.Row, "I").Value2 cIndex = Month(dRDate) - 2 + (Year(dRDate) - 2013) * 12 arrProjects(ProjectIndex, cIndex) = arrProjects(ProjectIndex, cIndex) + dRVal End If Set rngProject = rngFind.Find(arrProjects(ProjectIndex, 1), rngProject, xlValues, xlPart) Loop While rngProject.Address <> strProjectFirst End If End If Set rngFound = .Find(varProjectType, rngFound, xlValues, xlPart) Loop While rngFound.Address <> strFirst End If If cllProjects.Count > 0 Then Select Case varProjectType Case "Enhancements": wsEnha.Range("B4").Resize(cllProjects.Count, UBound(arrProjects, 2)).Value = arrProjects Case "OVH": wsOver.Range("B4").Resize(cllProjects.Count, UBound(arrProjects, 2)).Value = arrProjects End Select Set cllProjects = Nothing End If Next varProjectType On Error GoTo 0 End With Set cllProjects = Nothing Set wsData = Nothing Set wsEnha = Nothing Set wsOver = Nothing Set rngFound = Nothing Set rngProject = Nothing Erase arrProjects End Sub