如何在具有多个条件的VBA + Excel中使用INDEX和MATCH?

时间:2018-07-19 15:05:27

标签: excel vba excel-vba excel-formula match

我有一个带有一些标签的工作表,在第一个标签中有下表:

Tab1 - Table 1

在第二个选项卡中,键入“ cliente”和“ tipo”字段,然后我想获取ID作为返回。

我正在使用以下代码:

tipo = ActiveCell.Offset(0, -1).Value
cliente = Range("D5").Value
ActiveCell.Offset(0, -2) = WorksheetFunction.Index(Sheets("Tab 1").[Table1[ID]], WorksheetFunction.Match(cliente & tipo, Sheets("Tab 1").[Table1[CLIENTE]] & Sheets("Tab 1").[Table1[TIPO]], 0))

我不知道到底是什么问题,但是我尝试了很多方法,包括一些示例,这些示例拆分代码并使用Evaluate函数。但是,什么也没发生。

我该怎么办?

6 个答案:

答案 0 :(得分:4)

我更喜欢将常规公式用于此类操作。

假设按照您的示例布局A,B和C列,并且Cliente的查找值在F1中,而Tipo在F2中,那么这将是一个未作为数组输入的公式:

=INDEX(A1:A6,INDEX(MATCH(1,(F1=B1:B6)*(F2=C1:C6),0),1))

这将是等效的数组公式(用[Ctrl] + [Shift] + [Enter]输入):

{=INDEX(A1:A6,MATCH(1,(F1=B1:B6)*(F2=C1:C6),0))}

请参阅下文。...

Array Version

Non-array Version

答案 1 :(得分:1)

通常,=INDEX(MATCH, MATCH)不是数组公式,而是普通的公式。但是,您的情况有所不同-您不匹配行和列,而是匹配两列,因此应该匹配。数组公式必须使用 Ctrl + Shift + Enter 输入。

如果您有这样的数据:

enter image description here

这是G1中的数组公式:

=INDEX(A1:A6,MATCH(1,(E1=B1:B6)*(F1=C1:C6),0))

这是使用的方法:

Public Sub TestMe()
    Range("G1").FormulaArray = "=INDEX(A1:A6,MATCH(1,(E1=B1:B6)*(F1=C1:C6),0))"
End Sub

要查看此公式的工作原理,请在“公式”>“评估”选项卡({VERGLEICHMATCH德语)中查看Excel的计算:

enter image description here

答案 2 :(得分:0)

在另一个标签中,转到单元格A1并输入

='Tab 1'!B1&":"&'Tab 1'!C1

将其复制并粘贴到整个A列中。

在单元格B1中输入CD或其他Cliente值。在单元格B2中输入D或其他TIPO值。在B3中输入

=IFERROR(INDEX('Tab 1'!A:A,MATCH(B1&":"&B2,A:A,0)), "Not found!")

您应该在B3中得到结果。

答案 3 :(得分:0)

如果在数组公式中可以使用max

=MAX(IF(Table1[[#All],[CLIENTE]]=A2,IF(Table1[[#All],[TIPO]]=B2,Table1[[#All],[ID]])))

使用 Ctrl + Shift + Enter

输入

Data

答案 4 :(得分:0)

如果您不介意采用程序化解决方案,则可以使用VBA程序而不是公式来遍历两个选项卡。

在VBA编辑器中,将此代码放置在第一张工作表的区域中,例如“ Sheet 1”或您拥有的任何内容。不要将其放在ThisWorkbook区域。

Private Sub Worksheet_Change() 

Dim client As String
Dim type As String
Dim client2 As String
Dim type2 As String
Dim row As Integer
Dim row2 As Integer
Dim lastRow As Integer
Dim lastRowSheet2 As Integer

' Assuming your sheet is setup similar to Vityata's answer
lastRow = Sheets(1).Cells(Sheets(1).Rows.Count, "B").End(xlUp).row
lastRowSheet2 = Sheets(2).Cells(Sheets(2).Rows.Count, "B").End(xlUp).row

For row = 1 to lastRow
    client = Worksheets(1).Range("B" & row).Value
    type = Worksheets(1).Range("C" & row).Value

    For row2 = 1 to lastRowSheet2
        client2 = Worksheets(2).Range("B" & row2).Value
        type2 = Worksheets(2).Range("C" & row2).Value

        If client = client2 And type = type2 Then
            Worksheets(1).Range("A" & row).Value = Worksheets(2).Range("A" & row2).Value 
        End If
    Next
Next

End Sub

当然,您需要更改'A','B'和'C'以适合您的工作簿和所需范围。祝你好运。

答案 5 :(得分:0)

谢谢大家支持我。 我开始尝试使用Vityata的建议,并且有效。

我的最终代码是:ActiveCell.Offset(0, -2).FormulaArray = "=INDEX(Table1[ID],MATCH(1,(" & cliente & "=Table1[CLIENTE])*(" & valor & "=Table1[TIPO]),0))"