Использование INDEX MATCH в VBA с переменным местоположением поиска - PullRequest
0 голосов
/ 06 мая 2019

У меня проблемы с использованием переменных в критериях поиска в Index Match.Немного предыстории: я использую следующий код, чтобы установить значение переменной для строки # любой ячейки, содержащей «Current» в столбце B:

Dim rowHeaderNum As Integer

    rowHeaderNum = 0

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

Затем я использую приведенную ниже для хранения столбца # ячейкив строке 'rowHeaderNum', которая содержит значение "CurrentActual" для другой переменной:

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 Ответ

1 голос
/ 07 мая 2019

Использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...