View Full Version : Autofilter with more than two criteria
w8k17
07-24-2015, 08:09 AM
Hey everyone,
I have a database, which I want to filter for keywords (using a logical OR) with regards to a certain column. However, I need to be able to specify more than two keywords but the autofilter function does not allow for more than two. So, I found a workaround using Arrays but unfortunately, it neither works for more than two arrays. Here's an example of what I want to do:
If Range("Keyword") <> "" Then
Dim Keywords() As String
Dim Placeholder As String
Dim Count As Integer
Dim Rank As Integer
Keywords = Split(Range("Keyword"), ",")
Rank = UBound(Keywords)
For Count = 0 To Rank
Keywords(Count) = Trim(Keywords(Count))
Placeholder = "=*" & Keywords(Count) & "*"
Keywords(Count) = Placeholder
Next Count
Worksheets("Summary").Range("$A$6:$H$20000").AutoFilter Field:=5, _
Criteria1:=Keywords, Operator:=xlFilterValues
End If
I also attached a spreadsheet so that you can try around with it. What happens is that if you add more than two keywords (separated by a comma each), then it does not use the logical OR for filtering anymore but filters the expressions in the column to be equal to ALL the keywords, which is nonsense.
Can anyone help me out with this? I would really appreciate it!
Thanks in advance and have a nice weekend!
Best,
Alexander
mperrah
07-24-2015, 12:50 PM
this uses looping instead of filters.
Not perfect but a start.
It looks specifically for 3 keywords. I am tweaking it to look for random amounts of keywords.
It hides rows with unmatched keywords..
I added an unhide script too.
Sub testFilter()
Dim wsSum As Worksheet
Dim lr, r As Long
Dim myKeywords, firstKey, lastKey, mCnt, k
Set wsSum = Sheets("Summary")
wsSum.Activate
With wsSum
lr = .Cells(Rows.Count, "E").End(xlUp).Row
.Cells.AutoFilter
.Range("A8:A200").EntireRow.Hidden = False ' set to max range
If Range("sWord") <> "" Then
myKeywords = Split(Range("sWord"), ",")
firstKey = LBound(myKeywords)
lastKey = UBound(myKeywords)
For mCnt = 0 To lastKey
myKeywords(mCnt) = Trim(myKeywords(mCnt))
Next mCnt
End If
' this only looks for 3 keyword values and errors if not 3 keywords...
For r = lr To 8 Step -1
If .Cells(r, 5).Value <> myKeywords(0) And _
.Cells(r, 5).Value <> myKeywords(1) And _
.Cells(r, 5).Value <> myKeywords(2) Then
.Cells(r, 5).EntireRow.Hidden = True
End If
Next r
End With
End Sub
Sub unHideRows()
Rows("1:200").Select
Range(Selection, Selection.End(xlDown)).EntireRow.Hidden = False
End Sub
mperrah
07-24-2015, 01:28 PM
Ok, this looks for as many keywords you want, but...
it is case sensitive and only finds exact matches
so Welcome. is not welcome or Welcome (no period)
Sub testFilter2()
Dim wsSum As Worksheet
Dim lr, r As Long
Dim myKeywords, firstKey, lastKey, mCnt, k, kCnt
Set wsSum = Sheets("Summary")
wsSum.Activate
With wsSum
lr = .Cells(Rows.Count, "E").End(xlUp).Row
'.Cells.AutoFilter
.Range("A8:A200").EntireRow.Hidden = False ' set to max range
If Range("sWord") <> "" Then
myKeywords = Split(Range("sWord"), ",")
firstKey = LBound(myKeywords)
lastKey = UBound(myKeywords)
For mCnt = 0 To lastKey
myKeywords(mCnt) = Trim(myKeywords(mCnt))
Next mCnt
End If
For r = lr To 8 Step -1
kCnt = 0
For k = firstKey To lastKey
If .Cells(r, 5).Text = myKeywords(k) Then
kCnt = kCnt + 1
End If
Next k
If kCnt = 0 Then
.Cells(r, 5).EntireRow.Hidden = True
End If
Next r
End With
End Sub
mperrah
07-24-2015, 01:44 PM
Note, you can type * in the search keyword cell E7 and that will find "Like" results
still case sensitive though
p45cal
07-25-2015, 06:55 AM
See attached, uses Advanced Filter, case insensitive, currently up to 18 keywords or phrases (separate any phrases with commas (consequently won't look for commas)) but very easy indeed to increase that limit to more than a million!
w8k17b
07-27-2015, 02:24 AM
Hey guys,
thanks to both of you, mperrah and p45cal!
I am currently about to implement p45cal's version and it seems to be working just fine! Awesome. Thanks a million!
Best,
Alexander
w8k17b
07-31-2015, 02:15 AM
Hey p45cal,
I have a quick question and I would really appreciate if you could help me out.
The code you provided me with last week is working just fine. Thanks again so much! However, I now want to implement the possibility to search for the keywords using a logical AND instead of a logical OR. To prevent confusion: The relation between the search field "Keyword" and all the others ("Size", "Client", etc.) is a logical AND and always need be. The relation between different keywords, though, is a logical OR at the moment. I want to implement a button such that one can switch between a logical AND and OR when searching for multiple keywords.
Is it possible to slightly adjust the code such that it uses a logical AND instead of a logical OR or would that require rewriting the whole thing?
Thanks in advance!
Best,
Alexander
p45cal
07-31-2015, 03:35 AM
I have a quick question and I would really appreciate if you could help me out.The question might be quick but the answer isn't especially so.
See attached.
w8k17b
07-31-2015, 04:42 AM
The question might be quick but the answer isn't especially so.
See attached.
Oh my god, you are awesome! Thank you SO much! I deeply appreciate it!
I wish you a nice weekend!
Best,
Alexander
w8k17b
08-03-2015, 05:33 AM
Hey p45cal,
just one final question: I implemented your code and it's working perfectly fine. It actually works great. I just don't really understand the difference between the following two lines of code:
If Sheets("Search").ToggleButton1 Then
Sheets("Search").Range("M2").Resize(, UBound(xx) + 1) = xx
Set myCriteriaRng = Sheets("Search").Range("I1:I2").Resize(, UBound(xx) + 5)
myCriteriaRng.Select
Of course, that's the part of the code that is being executed if the button is switched to "AND". It uses rows 1 and 2 of the helper fields as the filter criteria. That makes sense.
Else
Sheets("Search").Range("M2").Resize(UBound(xx) + 1) = Application.Transpose(xx)
Set myCriteriaRng = Sheets("Search").Range("I1:M1").Resize(UBound(xx) + 2)
End If
That part of the code is being executed if the button is switched to "OR". It uses columns I to M as the filter criteria. That also makes sense BUT I don't understand why this is the crucial difference between the logical AND and logical OR search. Can you explain that in a sentence or two to a bloody VBA beginner like me?
Again, thanks a million in advance!
Best,
Alexander
p45cal
08-03-2015, 06:38 AM
Sheets("Search").Range("M2").Resize(, UBound(xx) + 1) = xx
Set myCriteriaRng = Sheets("Search").Range("I1:I2").Resize(, UBound(xx) + 5)
myCriteriaRng.Select
Of course, that's the part of the code that is being executed if the button is switched to "AND". It uses rows 1 and 2 of the helper fields as the filter criteria. That makes sense.
That part of the code is being executed if the button is switched to "OR". It uses columns I to M as the filter criteria. That also makes sense BUT I don't understand why this is the crucial difference between the logical AND and logical OR search. Can you explain that in a sentence or two to a bloody VBA beginner like me?
OMG, did I really leave myCriteria.Select in? (I did.) It should be commented out or deleted, but for the moment it's useful to see what the criteria range is if you step through the code with F8 having unhidden those columns.
The AND section uses the headers and only 1 row below to AND the lot. I used multiple headers, one for each criterion; it was easier to adjust the code and the criteria range. I could have a used a single cell with a formula, but I'd have had to construct a formula which resolved to TRUE or FALSE, place that formula in M2 or N2 and be constrained by formula length limits in a cell.
The OR section uses multiple rows in the criteria range but always remains 5 columns wide.
To explain it in a sentence or two - no I can't!
Have a look here: http://www.contextures.com/xladvfilter01.html#CriteriaRange The link should take you to the right spot on the page. There's a lot of good information at that website.
Also see:
http://www.excel-easy.com/examples/advanced-filter.html
https://blog.udemy.com/excel-advanced-filter/
or do a google for
excel advanced filter
You should get loads.
w8k17b
08-03-2015, 06:43 AM
Thank you so much, again! You are a life-saver!
Have a pleasant week!
Best,
Alexander
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.