在VBA中使用具有可变查找位置的INDEX MATCH

时间:2019-05-06 15:38:30

标签: excel vba

我在索引匹配中的查找条件内使用变量时遇到麻烦。背景知识:我使用以下代码将变量的值设置为B列中包含“当前”的任何单元格的行号:

Dim rowHeaderNum As Integer

    rowHeaderNum = 0

    On Error Resume Next
    rowHeaderNum = Application.Match("Current", ActiveSheet.Range("B:B"), 0)
    On Error GoTo 0

然后,我使用以下代码将包含“ CurrentActual”值的“ rowHeaderNum”行中单元格的列号存储到另一个变量中:

Dim currActColNum As Integer

currActColNum = 0
    currActColNum = Application.Match("CurrentActual", Rows(rowHeaderNum & ":" & rowHeaderNum), 0)

下面是我无法工作的“索引匹配”行:

Dim currActRev As Double

    currActRev = Application.Index(Columns(currActColNum), Application.Match("Gross Operating Profit", Columns("N:N"), 0))

currActRev将存储美元金额。 Match函数将始终使用列N作为查找数组。当我运行Index Match行时,我得到

  

类型不匹配

调试器中的错误。

1 个答案:

答案 0 :(得分:1)

使用WorksheetFunction …

Application.MatchOn Error Resume Next不起作用,因为Application.Match不会引发异常,因此您需要使用WorksheetFunction.Match

根据文档WorksheetFunction.Match method,它返回一个Double,因此您需要Dim RowHeaderNum As Double

Dim RowHeaderNum As Double
'RowHeaderNum = 0 'not needed it is always 0 after dim

On Error Resume Next
RowHeaderNum = Application.WorksheetFunction.Match("Current", ActiveSheet.Range("B:B"), False)
On Error GoTo 0

此外,您需要检查RowHeaderNum是否为0并停止操作,否则以下代码将失败,因为行0不存在。

If RowHeaderNum = 0 Then
    MsgBox "'Current' not found."
    Exit Sub
End If

您需要在此处完全相同

Dim CurrActColNum As Double
On Error Resume Next
CurrActColNum = Application.WorksheetFunction.Match("CurrentActual", Rows(RowHeaderNum), False)
On Error GoTo 0

If CurrActColNum = 0 Then
    MsgBox "'CurrentActual' not found."
    Exit Sub
End If

最后,WorksheetFunction.Index method返回一个Variant而不是一个Double,您在这里也需要进行错误处理。

Dim currActRev As Variant
On Error Resume Next
currActRev = Application.WorksheetFunction.Index(Columns(CurrActColNum), Application.WorksheetFunction.Match("Gross Operating Profit", Columns("N:N"), False))
On Error GoTo 0

Debug.Print currActRev 'print result in immediate window

使用Application …

请注意,您也可以使用Application.MatchApplication.Index(不使用WorksheetFunction),但是不能使用On Error …,而必须使用{{1 }}。同样,您的变量需要声明为IsError(),因为Variant可以返回错字Application.Match或类型Double

Error