2015-04-24 4 views
3

Я довольно новичок в VBA и работаю над пользовательской функцией (которая будет использоваться для более сложных целей в будущем - вот почему я хочу это сделать, используя VBA вместо стандартные формулы), задачей которой является получение даты из ячейки и определение ее позиции (номер строки) в столбце (например, столбец А).IsNumeric/IsError возвращает ошибку

Эта простая задача, которую я решил с помощью следующей процедуры:

Function TempRowNumber(OrgDate) 
    TempRowNumber = WorksheetFunction.Match(OrgDate, Range("A:A"), 0) 
End Function 

Он хорошо работает, конечно. Однако проблема заключается в том, что может случиться, что введенная функция не включена в диапазон. В этом случае функция должна выполнить поиск последней введенной даты до этой даты. Поскольку в этом диапазоне даты всегда сортируются в хронологическом порядке, я планировал построить формулу проверки ошибок (как условие) и соответствующий цикл.

Проблема заключается в том, что если я пишу формулу так:

=ISERROR(MATCH(C23;A:A;0)) 

все это хорошо (формула возвращает TRUE, если дата из ячейки С23 находится в колонке А, и FALSE, если дата не найден). Но если попытаться переписать эту формулу в процедуре VBA, I.A .:

Function FindDate(OrgDate) 

FindDate = IsError(WorksheetFunction.Match(OrgDate, Range("A:A"), 0)) 

End Function 

пользовательская функция возвращает #VALUE! ошибку, если дата не найдены (и FALSE, если это не так).
Ниже я прикладываю снимки о том, что я описываю.

У вас есть идея, что я должен делать? Заранее спасибо.

+0

Используйте функции * Iif() * и * IsError) *. –

+0

Но я действительно использую функцию IsError(), и она возвращает «#VALUE!». вместо значения TRUE, если дата, которую я ищу, не найдена. Однако функция Iif() указывает только, что делать в случае значений TRUE и FALSE, тогда как у меня есть проблема с условием (как описано выше, процедура VBA, написанная мной, приводит к ошибке FALSE или ошибке «#VALUE!») , – azera

ответ

2

Я не знаю причину этого, но это работает:

Function FindDate(Orgdate) 
    FindDate = IsError(Application.Match(Orgdate, Range("A:A"), 0)) 
End Function 

Логически он должен работать так же, как WorksheetFunction.Match и могут быть оценены IsError таким же образом, но я пробовал и я Получается тот же результат, что и ваш.

+0

Большое спасибо за вашу помощь, это действительно работает! – azera

+0

@azera Np. Спасибо, что согласился, хотя технически я не ответил на ваш вопрос. Это сейчас вне меня. Но давайте посмотрим, у нас здесь много MV MVP, которые могли бы пролить свет на вашу проблему. Мне тоже интересно. Как я уже сказал, логично это должно сработать. – L42

+2

Релевантная страница с сайта Чипа Пирсона [здесь] (http://www.cpearson.com/excel/callingworksheetfunctionsinvba.aspx). Использование 'WorksheetFunction.whatever' вызывает ошибки во время выполнения, поэтому вам нужно, чтобы операторы« On Error »могли их уловить, а не смотреть на возвращаемое значение. 'Application.whatever' не бросает ошибки во время выполнения, а возвращаемое значение может быть проверено с помощью' IsError' – barrowc

Смежные вопросы