关于excel vba:如何在VBA中将变量传递给双匹配函数

How to pass variables to an double match function in VBA

我在一个工作表中有一堆行和25列,需要使用vba根据B列和C列查找第4列中的值。我使用的是索引和多条件匹配函数的组合。

我试着通过https://www.mrexcel.com/forum/showthread.php跟进?650832 vba多条件索引匹配,并将一个整数变量传递到vba数组公式中无效。

我做了这个宏,它可以工作:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Sub VariablesInArrayFormula()
SA ="Apples"
C1 ="Oranges"
Range("D27").Select
Selection.FormulaArray ="=index(A2:G27,match(1,(B2:B27=b4)*(C2:C27= c6),0),4)"

Range("E27").Select
Selection.FormulaArray ="=index(A2:G27,match(1,(B2:B27=""Apples"")*(C2:C27=""Oranges""),0),4)"


f = Evaluate("index(A2:G27,match(1,(B2:B27=""Apples"")*(C2:C27=""Oranges""),0),4)")

Range("G27").Select
Selection.FormulaArray ="=index(A2:G27,match(1,(B2:B27="" & SA &"")*(C2:C27="" C1""),0),4)"

End Sub

我想把这个值赋给一个变量以备将来使用。

当我把它分配给d27时,它会工作,因为我引用了单元格引用b4和c6。

把它赋给E27单元也是可行的,但是我需要直接引用苹果和橙子,因为我更喜欢传递一个变量

当我输入单词apples和oranges时,将它赋给变量f是有效的。

当我试图传递对苹果和橙子(分别为sa和c1)的引用时,我收到一个#N/A错误。

有人能建议一种方法,我可以把变量传递给这个函数吗?

注意,我尝试使用worksheetfunction.index和worksheetfunction.match,并一直收到错误。具体来说,我尝试了:

1
gr4 = WorksheetFunction.Index(Range("A2:G27"), WorksheetFunction.Match(1, ((Range("B2:B27") = SA) * (Range("C2:C27") = C1)), 0), 4)

返回运行时错误13:类型不匹配。

奇怪的是,使用2个匹配项失败了,就像我使用单个列检查match函数是否有效一样。

1
2
3
4
5
Sub vfhj()
SA ="Apples"
C1 ="Oranges"
gr3 = WorksheetFunction.Index(Range("C2:C27"), WorksheetFunction.Match(C1, Range("C2:C27"), 0))
End Sub


如果我理解正确的话,我认为您的语法有点不正确——您省略了一些符号,忽略了将引号加倍的规则。也不需要选择。

1
Range("G27").FormulaArray ="=index(A2:G27,match(1,(B2:B27=""" & SA &""")*(C2:C27=""" & C1 &"""),0),4)"


使用内存阵列可能会更快一些:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Sub VariablesInArrayFormula()
Dim SA As String
SA ="Apples"

Dim C1 As String
C1 ="Oranges"

With Worksheets("Sheet1") 'Change to your worksheet
    Dim DtaArray As Variant
    DtaArray = .Range("B2:D27").Value

    Dim i As Long
    For i = LBound(DtaArray, 1) To UBound(DtaArray, 1)
        Dim ans
        If DtaArray(i, 1) = SA And dtaaray(i, 2) = C1 Then
            ans = DtaArray(i, 3)
            Exit For
        End If
    Next i

    .Range("G1").Value = ans
End With


End Sub