Использование WorksheetFunction …
Application.Match
и On Error Resume Next
не работает, потому что Application.Match
не выдает исключений, вам нужно использовать WorksheetFunction.Match
вместо.
Согласно документации, метод WorksheetFunction.Match возвращает 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 возвращает 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 …
, и вам нужно проверять ошибки, используя IsError()
. Также ваши переменные должны быть объявлены как Variant
, тогда как Application.Match
может возвращать опечатку Double
или тип Error
.
Dim RowHeaderNum As Variant
RowHeaderNum = Application.Match("Current", ActiveSheet.Range("B:B"), False)
If IsError(RowHeaderNum) Then
MsgBox "'Current' not found."
Exit Sub
End If
Dim CurrActColNum As Variant
CurrActColNum = Application.Match("CurrentActual", Rows(RowHeaderNum), False)
If IsError(CurrActColNum) Then
MsgBox "'CurrentActual' not found."
Exit Sub
End If
Dim currActRev As Variant, currMatch As Variant
currMatch = Application.Match("Gross Operating Profit", Columns("N:N"), False)
If Not IsError(currMatch) Then
currActRev = Application.Index(Columns(CurrActColNum), currMatch)
End If
Debug.Print currActRev 'print result in immediate window