I posted a question in regards to finding a match with multi-column criteria. The provided answer works great. But I'm trying to make it a universal solution for my project, in terms of how many columns criteria is used.
Here is the question I am referencing: Question & Answer I used
Here is what I've managed to come up with so far:
Public Function CRITERIA(ParamArray values() As Variant) As Variant
....
CRITERIA = values
End Function
Where the actual UDF referenced in the cells will be:
Public Function MULTIMATCHEXISTS(args As Variant, ParamArray colmns() As Variant) As Boolean
Dim argsCount As Long, colmnsCount As Long, cl As Long, a As Long
argsCount = UBound(args) - LBound(args) + 1
colmnsCount = UBound(colmns) - LBound(colmns) + 1
Dim tbl As ListObject
Dim ws As Worksheet
Dim lr As ListRow
Dim match_candidate As Variant, arg As Variant
If argsCount <> colmnsCount Then
....
Exit Function
Else
'Get the name of the table from any column provided (this of courses assumes a 1:1 table search)
Set tbl = colmns(0).ListObject
'Get tables worksheet from the table object
Set ws = ThisWorkbook.Sheets(tbl.Parent.Name)
'Iterate through columns?
For cl = LBound(colmns) To UBound(colmns)
'Get each value from column
For each lr In tbl.ListRows
match_candidate = Intersect(lr.Range, colmns(cl)).value
'Iterate through arguments?
For a = LBound(args) To UBound(args)
If match_candidate = args(a) Then
Debug.Print "its a match for " & args(a) & " in column " & colmns(cl)
MULTIMATCHEXISTS = True
Else
MULTIMATCHEXISTS = False
End If
Next a
Next lr
Next cl
End If
End Function
Where someone would use the UDF as follows:
=MULTIMATCHEXISTS(CRITERIA(A2,A3,A4), Table2[Column1], Table2[Column8], Table2[Column5])
Basically what I would like is for it to validate if the first value = it's respective queried column and so forth (I.e args(0) should = colmns(0) value, args(1) should = colmns(1) value)
So far, I can find matches using the above example, but I don't know how to check if ALL values match at the same time. Additionally I can't find any native functions to compare arrays on the MSDN site. It's an awkward site to navigate IMO.
Don't let my rep fool you. I'm new to VBA and will be the first to admit my newbiness, I'm having a hard time converting over. I don't find the MSDN documentation to be as helpful as other languages, personally. So if you can share any resources you use I would appreciate it.
In an effort to simplify my desired outcome:
Take table 1 that has a list of clients:
A B C D
-----------------------------------------------------------
1 | Name | Email | Phone | ISMATCH? |
-----------------------------------------------------------
2 | Steve Jobs | stevejobs@gmail.com | 123456 | True |
-----------------------------------------------------------
3 | Bill Gates | billgates@apple.com | 123456 | True |
-----------------------------------------------------------
4 | Steve Woz | stevewoz@outlook.com| 123456 | False |
-----------------------------------------------------------
Take table 2 that has a detailed description of those clients, but every client is queried by different arguments:
J K L M
-----------------------------------------------------------
1 | Name | Company | Phone | Email |
-----------------------------------------------------------
2 | Steve Jobs | Apple | 123456 | stevejobs@gmail.com |
-----------------------------------------------------------
3 | Bill Gates | Apple | 123456 | billgates@apple.com |
-----------------------------------------------------------
4 |Stevie Wonder | Apple | 123456 | steviewon@outlook.com |
-----------------------------------------------------------
What I would like is to be able to pick and choose which criteria to evaluate and then select their corresponding columns in Table 2. So back in Table 1 D2 it would be something like this:
=MULTIMATCHEXISTS(CRITERIA([@NAME], [@EMAIL]), Table2[Name], Table2[Email])
But lets say for bill gates I want to check more than those 2 criteria, so Table 1 D3 would be:
=MULTIMATCHEXISTS(CRITERIA([@NAME], [@PHONE], [@EMAIL]), Table2[Name], Table2[Phone], Table2[Email])
And for Steve Woz Table 1 D4:
=MULTIMATCHEXISTS([@Name], Table2[Name])
Those are practical examples of my UDF in action. Im trying to make both arguments dynamically flexible. I live off of named ranges, but it doesn't have to be specific to that
Try this. Note there is no error checking.
The Filter_Data array is 1-based but the ParamArray is zero-based!
I found a solution that works for me and my needs; I played around with Charles' answer and couldn't quite figure out the structure based on his feedback. Although, I did take some of the information I learned from his feedback and applied it. Hopefully this can help someone else, as ugly or coarse it is. I think I was making it too hard on myself trying to visualize the loops within the loops within the loops. So I decided to settle for an
Index/Match
approach.And more importantly, I really want to learn this language, so if you're a pro out there and spot something wrong I should focus on please let me know.
So basically I do a dynamic
INDEX/MATCH
validation and process it accordingly. I can now call=MULTIMATCHEXISTS
with as little as 1 argument/column to undefined:Where 1 argument is:
Although the name 'multimatch' doesn't quite fit in that circumstance
I'm still interested to see what others come up with if you want to chime in with your 2 cents
OK, here is a version that more closely matches what you want: it is the equivalent of MATCH for your arbitrary set of criterias and columns.
Call example: =multimatch2(criteria(C2,B2,A2),C4:C70,B4:B70,A4:A70)