Sub filterData()
    Dim filterCriteria As String
    x = 1
    Do While Not IsEmpty(filterCriteria)
        filterCriteria = (Sheets("Lists").Cells(x, 2))
        Sheets(filterCriteria).Select
        Sheets(filterCriteria).Cells.Clear
        Range("A1") = "Date"
        Range("B1") = "Item"
        Range("C1") = "Category"
        Range("D1") = "Quantity"
        Range("E1") = "Rate"
        Range("F1") = "Total"
        Range("A1:F1").Font.Bold = True
        Range("A1:F1").Font.ColorIndex = 5
        Sheets("BookEntry").Select
        Dim lastRow As Long
        lastRow = Sheets("BookEntry").Cells.Find(What:="*", _
        After:=Range("A1"), _
        LookAt:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByRows, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False).row
        Dim lastColumn As Long
        lastColumn = Sheets("BookEntry").Cells.Find(What:="*", _
        After:=Range("A1"), _
        LookAt:=xlPart, _
        LookIn:=xlFormulas, _
        SearchOrder:=xlByColumns, _
        SearchDirection:=xlPrevious, _
        MatchCase:=False).Column
        Sheets("BookEntry").Range(Cells(1, 1), Cells(lastRow, lastColumn)).AutoFilter Field:=3, Criteria1:=filterCriteria
        Sheets("BookEntry").Range(Cells(2, 1), Cells(lastRow, lastColumn)).Copy
        Sheets(filterCriteria).Select
        erow = Sheets(filterCriteria).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).row
        Sheets(filterCriteria).Paste Destination:=Worksheets(filterCriteria).Rows(erow)
        Sheets("BookEntry").Select
        Sheets("BookEntry").Range(Cells(1, 1), Cells(lastRow, lastColumn)).AutoFilter Field:=3
        ActiveWorkbook.Save
        x = x + 1
    Loop
End Sub
            Asked
            
        
        
            Active
            
        
            Viewed 43 times
        
    1
            
            
         
    
    
        Community
        
- 1
- 1
 
    
    
        user252391
        
- 13
- 3
1 Answers
2
            You're doing two mistakes.
1- You are checking the filterCriteria before assigning it.
2- To check for an empty filterCriteria, you should check the string with Len(Trim(filterCriteria)) > 0, otherwise you should declare the variable as variant because IsEmpty works with variants. But the string option is better.
Change the structure of the loop into this:
x = 1
Dim filterCriteria As String
filterCriteria = Sheets("Lists").Cells(x, 2).value
Do While Len(Trim(filterCriteria)) > 0
    ...
    ...
    x = x + 1
    filterCriteria = Sheets("Lists").Cells(x, 2).value
Loop
Also try to get rid of those .Select stuff.
- 
                    Wow that was seriously fast! Thanks for your help A.S.H. I'll do my best to implement your advice. If I manage to get it to work, how do I mark this tread solved? – user252391 Mar 18 '17 at 08:17
- 
                    Fantastic! That works perfectly. I kinda get what you mean but if you could possibly comment my original code that would be really helpful for me to learn. Also I don't know how to remove the .Select stuff. will my code still work without it? – user252391 Mar 18 '17 at 08:32
- 
                    1@user252391 - If A.S.H's answer solves your problem, you can show that by clicking on the "tick" that should be appearing to the left of the answer. That signifies that this is the answer that helped you the most, and will give him some extra "reputation" on the site. (And you gain a few extra rep points too when you do so.) – YowE3K Mar 18 '17 at 08:32
- 
                    @user252391 the link I provided at the end of the answer is a perfect place to start about getting rid of the `Select stuff`. There are two excellent answers there, I advice you to read them carefully and practice their recommendations. – A.S.H Mar 18 '17 at 08:43
- 
                    1Thank you so much for your help A.S.H you have solved my problem making my workbook useful for me and set me on track to better coding too. I'm a very happy chappy!! – user252391 Mar 18 '17 at 08:49
- 
                    Now it makes sense! :) – user252391 Mar 18 '17 at 08:52
