我在索引匹配中的查找条件内使用变量时遇到麻烦。背景知识:我使用以下代码将变量的值设置为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
行时,我得到
类型不匹配
调试器中的错误。
答案 0 :(得分:1)
WorksheetFunction …
Application.Match
和On 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.Match
和Application.Index
(不使用WorksheetFunction
),但是不能使用On Error …
,而必须使用{{1 }}。同样,您的变量需要声明为IsError()
,因为Variant
可以返回错字Application.Match
或类型Double
。
Error