如何在VBA

时间:2018-04-23 20:19:26

标签: vba excel-vba indexing match excel

我在工作表中有一堆行和25列,需要使用VBA基于列B和C找到第4列中的值。我正在使用索引和多个条件匹配函数的组合。

我试图通过https://www.mrexcel.com/forum/showthread.php?650832-VBA-Multiple-Criteria-Index-Matchpass an integer variable into vba array formula跟进无效。

我制作了这个有效的宏:

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也可以,但是我需要直接引用苹果和橘子,我希望传递变量

将其分配给变量f时,我传入单词Apples和Oranges

当我尝试传递对Apples和Oranges(分别为SA和C1)的引用时,我收到#N/A错误。

任何人都可以提出一种方法,我可以将变量传递给此函数。

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

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

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

奇怪的是,使用2个匹配失败,就像我使用单个列检查匹配函数一样

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

2 个答案:

答案 0 :(得分:1)

如果我理解正确,我认为你的语法略有偏差 - 你省略了一些&符号,忽略了关于加倍引号的规则。也无需选择。

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

答案 1 :(得分:0)

使用内存数组可能会更快一点:

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