VBA中的索引匹配2条件

我有一个macros,我试图创build一个旧的值映射到新值。 在某一点上,我需要在两列进行匹配,并从第三列中获取值。 在正常的Excel中我会运行下面的公式,但因为它是一个公式数组(必须按CTRL + SHIFT + ENTER运行)我不太确定如何得到这个工作在VBA

=INDEX($D:$D,MATCH(1,(E2=$A:$A)*(F2=$B:$B),0)) 

任何帮助赞赏

你有没有尝试过?

 Cell.FormulaArray() 

它应该使用正常的表示法,尽pipe它适用于R1C1

基本上有三种方法来评估一个数组公式到VBA中的结果。

首先是“方括号”评估。 这就像处理工作表一样处理一个公式。

 Dim result As Variant result = [INDEX('Sheet1'!D:D,MATCH(1,(E2='Sheet1'!A:A)*(F2='Sheet1'!B:B),0))] Debug.Print result 

必须小心明确地显示工作表亲子关系。 在上面,全列已经被赋予了一个父工作表,但个别单元格没有。 单个单元格将默认为可能甚至可能不在同一个工作簿中的ActiveSheet属性 。 明确定义所有单元格引用!

第二种方法是使用Application.Evaluate方法 。 这允许使用string结构的公式更自由。

 Dim result As Variant, wsn As String wsn = Worksheets("Sheet1").Name result = Application.Evaluate("INDEX('" & wsn & "'!D:D, " & _ "MATCH(1, (E2='" & wsn & "'!A:A)*(F2='" & wsn & "'!B:B),0))") Debug.Print result 

同样,只有完整的列引用已被给予父工作表引用。 这应该在运行时间之前修复。 此方法对数组公式更好,因为您可以使用string构造将完整的列引用切割到Worksheet.UsedRange属性中的行。

如前所述,第三种方法涉及使用Range.FormulaArray属性将公式写入工作表单元格,并从单元格中检索答案。