Почему это vlookup приводит к сообщению об ошибке - PullRequest
0 голосов
/ 29 марта 2019

Когда я пытаюсь запустить приведенный ниже код, появляется следующее сообщение об ошибке: «Невозможно получить свойство Vlookup класса WorksheetFunction»

Я прошел по коду, и он появляется во втором vlookup. Первый vlookup работает нормально.

Единственное различие между двумя поисками состоит в том, что искомое значение изменилось с Range ("R" & i) -> Range ("S" & rrow); i и rrow оба являются целыми числами, и оба диапазона имеют существующие значения.

Worksheets("Sheet2").Cells(i, 22) = Not(IsError(Application.WorksheetFunction.VLookup(Range("R" & i),Worksheets("Sheet3").Range("AD:AD"), 1, False)))

Worksheets("Sheet2").Cells(i, 21) = Not(IsError(Application.WorksheetFunction.VLookup(Range("S" & rrow),Worksheets("Sheet3").Range("AD:AD"), 1, False)))

Если кто-нибудь может сообщить мне, почему это происходит, это будет очень полезно!


1 Ответ

1 голос
/ 29 марта 2019

Интерфейс WorksheetFuntion имеет раннее связывание: во время разработки вы получаете автозаполнение, всплывающие подсказки с параметрами и т. Д. Во время выполнения раннее связывание WorksheetFunction будет повышать фактические ошибки времени выполнения VBA в случае сбоя.

Таким образом, возвращаемое значение никогда не достигает IsError, потому что ошибка не , возвращается , а повышается .

Как Скотт упомянул , вы можете использовать взамен Application.VLookup - это с поздним ограничением, поэтому во время разработки вы не получите ни автозаполнения, ни всплывающих подсказок по параметрам; компилятор не поможет вам, если вы сделаете опечатку. Во время выполнения функции листа с поздней привязкой будут возвращать значения ошибок (фактическое значение Variant/Error), которые можно сравнить, например, с. CVErr(xlErrNA) или подается на IsError для оценки.

Not IsError(expression) вернет логическое значение, а не значение поиска - это может или не может быть тем, что вы намеревались.

Итак, замените Application.WorksheetFunction.VLookup на Application.VLookup, и ваш код должен работать ... кроме ...

и оба диапазона имеют значения, которые существуют

Если бы это было так, ранний предел WorksheetFunction.VLookup не вызвал бы ошибку (при условии, что все ваши параметры верны).

Наконец, поскольку вас интересует только то, существует ли значение или нет, рассмотрите возможность использования вместо него Application.Match (WorksheetFunction.Match) - он также возвращает значение ошибки #N/A, если искомое значение не найдено, но должен работать немного лучше.

«Невозможно получить свойство {имя функции} класса WorksheetFunction» также может означать, что ваши параметры в некотором роде неверны. Номера строк должны быть Long, а не Integer, и обратите внимание, что Range("R" & i) неявно ссылается на то, чем является ActiveSheet, так как он не квалифицирован с правильной ссылкой на объект Worksheet - возможно, активный лист не тот, который предполагает ваш код?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...