Link to home
Start Free TrialLog in
Avatar of Jagwarman
Jagwarman

asked on

VBA to filter

When recording a macro where you want to filter it would come out like the below so I presume that is static and it would always be looking for the same filter every time you run it

Selection.AutoFilter
    ActiveSheet.Range("$A$1:$N$65967").AutoFilter Field:=13, Criteria1:=Array( _
        "Adam", "Carl ", "Dave", "Debbie", "Jack" _
        , "James", "Joanna", "Kyle", "Lewis", "Molly", _
        xlFilterValues

My problem is each time I would need to run it the names will not be the same and the range will also be different.

Selection.AutoFilter
    ActiveSheet.Range("$A$1:$N$72866").AutoFilter Field:=13, Criteria1:=Array( _
        "Adam", "Carl ", "Dave", "Debbie", "Jack" _
        , "James", "Lewis", "Molly", _
        "Rebecca", "Ryan", "Sylvia"), Operator:= _
        xlFilterValues

All I really want to do every time I run it is to say exclude from the filter “System Entries” and make sure the range covers all rows.

Could an expert provide me with the VBA code that will do this.

Many thanks
Avatar of Koen
Koen
Flag of Belgium image

here is explained how you turn your column  into an array you can use:

http://www.thespreadsheetguru.com/the-code-vault/2014/6/19/filter-data-with-an-excel-table-read-into-a-vba-array

then you find and remove the value you don't need
then you apply this array to your filter.
Avatar of Professor J
Professor J

pass the array of criteria to a range and then your range will be holiding the criterias

like this.  see attached example file.  

Sub Test()
    Dim N As Long, r As Range
With Sheets("CriteriaSheet")
        N = .Cells(Rows.Count, "A").End(xlUp).Row
        ReDim arry(1 To N)
        For i = 1 To N
            arry(i) = .Cells(i, 1)
        Next i
End With
On Error Resume Next
    Range("$A$1:$N$72866").AutoFilter
    ActiveSheet.Range("$A$1:$N$72866").AutoFilter Field:=2, Criteria1:=arry, Operator:=xlFilterValues
    On Error GoTo 0
End Sub

Open in new window

EE.xlsm
HI,

pls try

Sub Test()
Dim Arry

With Sheets("CriteriaSheet")
    Set Rng = Range(.Range("A1"), .Cells(Rows.Count, "A").End(xlUp))
    Arry = WorksheetFunction.Index(WorksheetFunction.Transpose(Rng), 1, 0)
End With
On Error Resume Next
    Set rngFilter = ActiveSheet.UsedRange
    rngFilter.AutoFilter
    rngFilter.AutoFilter Field:=13, Criteria1:=Arry, Operator:=xlFilterValues
On Error GoTo 0
End Sub

Open in new window

Regards
SOLUTION
Avatar of Professor J
Professor J

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of Jagwarman

ASKER

Rgonzo1971 I get an error "Unable to get the index property of the worksheetFunction Class" on the line

Arry = WorksheetFunction.Index(WorksheetFunction.Transpose(Rng), 1, 0)

ProfessorJimJam your last one does filter.

However, my problem is, as I stated at the beginning " every time I run it is to say exclude from the filter “System Entries” " I never know what other names will be in the list but I do know I never want to include "System Entries" so my question is, is what I want to do not possible.
Rgonzo1971 just realized that in your solution there needs to be more than one item in the CriteriaSheet. However, my problem still remains I need the reverse of what you are doing in that I only want to filter 'Out'
“System Entries”

Thanks
then try
Sub Test()
Dim Arry

With Sheets("CriteriaSheet")
    Set Rng = Range(.Range("A1"), .Cells(Rows.Count, "A").End(xlUp))
    If Rng.Cells.Count > 1 Then
        Arry = WorksheetFunction.Index(WorksheetFunction.Transpose(Rng), 1, 0)
    Else
        Arry = Array(Rng.Value)
    End If
End With
Arry = Filter(Arry, "System Entries", False)
On Error Resume Next
    Set rngFilter = ActiveSheet.UsedRange
    rngFilter.AutoFilter
    rngFilter.AutoFilter Field:=1, Criteria1:=Arry, Operator:=xlFilterValues
On Error GoTo 0
End Sub

Open in new window

I guess the answer is I would always have to put the names on the criteria sheet [which is what I was hoping not to have to do] because if a new name is in the file it will not be picked up unless it is on the list. is it not possible for the criteria sheet to have the names that should not be in the filter instead of those that are in the filter
have you tried my last answer it filters out System Entries
Hi Rgonzo1971 I have but so far as I can tell I still need to put the names I want to keep in the criteria sheet which is what I was hoping I would not need to do.
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Koen, not being a VBA expert I'm not sure I fully understand. I presume I have to copy the script into my Macro. I made 'Table1' in my file as I presumed the macro would look for that

but when I run it it gets stuck at

"Set myTable = Settings_sht.ListObjects("Table1")"

with Subscript out of range.
Could you send a dummy
A dummy copy as requested.

Using the criteria sheet with the names the macro works.  However each day new people post entries and these are never captured because their names are not on the criteria sheet.
Filter.xlsm
ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
perfect Rgonzo Many thanks.
Thank you to everyone but Rgonzo1971 was on the button.