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)的引用时,我收到一个
有人能建议一种方法,我可以把变量传递给这个函数吗?
注意,我尝试使用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 |