2015-01-06 6 views
2

Я пытаюсь выполнить функцию сопоставления нескольких критериев в vba, но я не могу получить результаты. код я использовал следующее:excel vba - совпадение с несколькими критериями

wsDest.Range(wsDest.Cells(i, X), wsDest.Cells(i, X)) = _ 
    Application.WorksheetFunction.Index(wsSour.Range("C3:C8763"), _ 
    Application.WorksheetFunction.Match(wsDest.Cells(i, 1) & "&" & wsDest.Cells(i, 2), _ 
     wsSour.Range("A3:A8763") & "&" & wsSour.Range("B3:B8763"), 0), 0) 

Для части матча я пытался использовать метод EXcel по

=MATCH(criteria1 & criteria2,range1 & range2,0)

+0

'&' является concatinate строки оператора, то есть " a "&" b "становится" ab ". Вы не можете использовать '&' для объединения двух диапазонов. Вы пытаетесь оценить индекс, по которому критерии1 соответствуют в диапазоне1 по этому индексу, а критерии 2 соответствуют диапазону2 в этом индексе по формуле «MATCH (критерии1 и критерии2, диапазон1 и диапазон2,0)»? Это не сработает, потому что «Match» не имеет такой функции. –

+1

@ Fumu7 - вы * можете * использовать MATCH() для этого на листе. См. Например: http://www.excel-easy.com/examples/two-column-lookup.html –

+0

@ Тим Уильямс: Спасибо за ваш совет. –

ответ

3

Вы можете использовать метод WorkSheet.Evaluate, чтобы сделать это.

Вот простой пример:

enter image description here

Sub Tester() 

    Dim v, sht, a1, a2 

    Set sht = ActiveSheet 

    a1 = sht.Cells(7, 1).Address(False, False) 
    a2 = sht.Cells(7, 2).Address(False, False) 

    v = sht.Evaluate("MATCH(" & a1 & "&" & a2 & ",A2:A5&B2:B5,0)") 

    sht.Range("B9") = v 

End Sub 

EDIT: здесь это более надежный пример, принимая во внимание различные листы

Sub Tester2() 

    Dim v, shtDest, shtSrc, a1, a2, i 

    Set shtDest = ThisWorkbook.Sheets("Dest") 
    Set shtSrc = ThisWorkbook.Sheets("Source") 

    i = 1 

    a1 = "'" & shtDest.Name & "'!" & shtDest.Cells(i, 1).Address(False, False) 
    a2 = "'" & shtDest.Name & "'!" & shtDest.Cells(i, 2).Address(False, False) 

    Debug.Print a1, a2 

    v = shtSrc.Evaluate("MATCH(" & a1 & "&" & a2 & ",A2:A9&B2:B9,0)") 

    If Not IsError(v) Then 
     shtDest.Cells(i, 3).Value = shtSrc.Range("C2:C9").Cells(v).Value 
    End If 

End Sub 
+1

Да, * Оценить * всегда рассматривать формулу как формулу * массива *. +1 – L42

+0

@Tim Williams Спасибо! Я попробую! Но что, если массив поиска не будет строкой? Могу ли я делать "," & (range1) & "&" & (range2) & ", 0)")? – sndrosilva

Смежные вопросы