2016-03-15 98 views
1

我有一个宏,我试图创建一个旧的值映射到新的值。在某一点上,我需要对两列进行匹配,并从第三列中获取值。在正常Excel中我会运行下面的公式,但因为它是式阵列(必须按CTRL + SHIFT + ENTER运行)我不太知道如何让这个在VBAVBA中的索引匹配2条件

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

任何工作帮助赞赏

回答

2

你试过了吗?

Cell.FormulaArray() 

它应与正常符号工作,尽管它是用于R1C1

+0

对不起,不熟悉它,或者很确定语法应该如何工作? var3 = cell.FormulaArray(WorksheetFunction.Index(wsM.Range(“$ D:$ D”),WorksheetFunction.Match(1,(wsM.Range(“$ A:$ A”)= tagN)* (wsM.Range(“$ B:$ B”)= tagS),0))) – Sanfly

+0

也不工作:var3.FormulaArray = WorksheetFunction.Index(wsM.Range(“$ D:$ D”),WorksheetFunction.Match (1,(wsM.Range(“$ A:$ A”)= tagN)*(wsM.Range(“$ B:$ B”)= tagS),0)) – Sanfly

+0

只需使用公式它在一个单元格中。所以如果你想在A1中插入它,使用Range(“A1”)。 FormulaArray =“= INDEX(...” – bioschaf

0

基本上有三种方法来评估的阵列式内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 property,这可能甚至可能不在同一个工作簿中。明确定义所有单元格引用!第二种方法是Application.Evaluate method。这允许使用字符串构造的公式更自由。

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 

此外,只有完整的列引用已被给予父工作表引用。这应该在运行时使用之前修复。此方法对数组公式更好,因为您可以使用字符串构造将完整列引用截至Worksheet.UsedRange property中的行。

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

+0

谢谢,这是非常彻底的!:) – Sanfly