Вам все равно нужно отправить тело аргумента MATCH
в виде строки. «+» Не объединяется.
WorksheetFunction.Match(criteria1 & "&" & criteria2, Range(), 0)
Следует соединить два значения и выполнить совпадение.
Это работает:
Sub dural()
crit1 = "find "
crit2 = "happiness"
N = Application.WorksheetFunction.Match(crit1 & crit2, Range("A1:A10"), 0)
MsgBox N
End Sub
с, скажем, A3, содержащий:
найти счастье
EDIT # 1:
Рассмотрим случай нескольких критериев в нескольких столбцах. Например:
[/g3]
и мы хотим, чтобы VBA получал имя small, black, dog
без VBA в ячейке листа, которую мы можем использовать:
=INDEX(D1:D100,SUMPRODUCT(--(A1:A100="dog")*(B1:B100="small")*(C1:C100="black")*ROW(1:100)),1)
, чтобы получить имя Oscar
, мы можем использовать ту же формулу в VBA
Sub luxation()
Dim s As String, s2 As String
s = "INDEX(D1:D100,SUMPRODUCT(--(A1:A100=""dog"")*(B1:B100=""small"")*(C1:C100=""black"")*ROW(1:100)),1)"
s2 = Evaluate(s)
MsgBox s2
End Sub
Не легко отображает реализацию VBA, но вы можете обмануть бит, используя Evaluate:
Sub Tester()
Dim v1, v2, f
v1 = "y"
v2 = 11
Sheet1.Names.Add Name:="X", RefersTo:=v1
Sheet1.Names.Add Name:="Y", RefersTo:=v2
f = "MATCH(X&Y,$A$2:$A$5&$B$2:$B$5, 0)"
Debug.Print Sheet1.Evaluate(f)
End Sub
или пропуская имена:
Sub Tester2()
Const F_TEMPL As String = "MATCH(""{V1}""&""{V2}"",$A$2:$A$5&$B$2:$B$5, 0)"
Dim v1, v2, f
f = Replace(F_TEMPL, "{V1}", "x")
f = Replace(f, "{V2}", 12)
Debug.Print Sheet1.Evaluate(f)
End Sub