我有一个宏,我试图创建一个旧的值映射到新的值。在某一点上,我需要对两列进行匹配,并从第三列中获取值。在正常Excel中我会运行下面的公式,但因为它是式阵列(必须按CTRL + SHIFT + ENTER运行)我不太知道如何让这个在VBAVBA中的索引匹配2条件
=INDEX($D:$D,MATCH(1,(E2=$A:$A)*(F2=$B:$B),0))
任何工作帮助赞赏
我有一个宏,我试图创建一个旧的值映射到新的值。在某一点上,我需要对两列进行匹配,并从第三列中获取值。在正常Excel中我会运行下面的公式,但因为它是式阵列(必须按CTRL + SHIFT + ENTER运行)我不太知道如何让这个在VBAVBA中的索引匹配2条件
=INDEX($D:$D,MATCH(1,(E2=$A:$A)*(F2=$B:$B),0))
任何工作帮助赞赏
你试过了吗?
Cell.FormulaArray()
它应与正常符号工作,尽管它是用于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 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将公式写入工作表单元格并从单元格中检索答案。
谢谢,这是非常彻底的!:) – Sanfly
对不起,不熟悉它,或者很确定语法应该如何工作? var3 = cell.FormulaArray(WorksheetFunction.Index(wsM.Range(“$ D:$ D”),WorksheetFunction.Match(1,(wsM.Range(“$ A:$ A”)= tagN)* (wsM.Range(“$ B:$ B”)= tagS),0))) – Sanfly
也不工作:var3.FormulaArray = WorksheetFunction.Index(wsM.Range(“$ D:$ D”),WorksheetFunction.Match (1,(wsM.Range(“$ A:$ A”)= tagN)*(wsM.Range(“$ B:$ B”)= tagS),0)) – Sanfly
只需使用公式它在一个单元格中。所以如果你想在A1中插入它,使用Range(“A1”)。 FormulaArray =“= INDEX(...” – bioschaf