Страницы: 1
RSS
Проверка Range на наличие ошибок, VBA
 
Добрый день,

Мне необходимо проверить столбец А на наличие ошибок (знач, н/д и любых других) и остановить выполнение кода при из наличии. У меня получилось сделать это для одной конкретной ячейки, но не получается для столбца или любого другого количества ячеек.
Код
If Application.IsError(Range("A1").Value) = True Then 
   'код
Else
   'код
End If

Как можно задать Range для проверки? Или надо каждую ячейку перебирать?
 
Валерий Кишин, здравствуйте
Пробуйте
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Set rng = Nothing желательно добавить
 
Цитата
vikttur написал:
Set rng = Nothing желательно
да тоже не очень-то нужно в данном случае. Set obj = Nothing в конце процедур лучше делать в обязательном порядке в отношении сторонних объектов, которые мы создаем отдельно. Например через CreateObject. Либо, если объект объявлен глобально(Public obj). Остальные VBA достаточно неплохо удаляет из памяти самостоятельно по окончанию процедуры.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Jack Famous, Да, работает как надо, спасибо.
Код оказался на удивление сложным по сравнению с моими ожиданиями.
 
Вариант
Код
Sub ErrSelect()
    Dim c As Range
     
    For Each c In Range("A2:B10")
        If IsError(c.Value) Then
            MsgBox "Err", 16, ""
            c.Select: Exit Sub
        End If
    Next c
    
    MsgBox "OK", 64, ""
End Sub

Цитата
Дмитрий(The_Prist) Щербаков написал:  Set obj = Nothing ... в обязательном порядке в отношении сторонних объектов
Ага, спасибо
 
Цитата
Валерий Кишин: Код оказался на удивление сложным
Если дело в количестве строк, то вот ещё более укороченный короткий вариант от vikttur
Код
Sub ErrSelect()
    Dim c As Range
    For Each c In Selection
        If IsError(c.Value2) Then c.Select: MsgBox "Err", 16, "": Exit Sub
    Next c
    MsgBox "OK", 64, ""
End Sub
Изменено: Jack Famous - 15.10.2021 12:03:55
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Ну, так уж ужимать (с удалением пустых строк)  не стоит.

Цитата
Валерий Кишин написал: Код оказался на удивление сложным
Я, например, твою строку
Код
If rng.Cells.Count = 1 Then If IsError(rng.Value2) Then GoTo er Else GoTo ex
с "беглого" раза не прочитал )
 
Цитата
vikttur: Я твою строку с "беглого" раза не прочитал )
да - недавно начал короткие ифы так вкладывать и привык уже  :D
Кстати говоря, по этому принципу теперь заменяю If a=3 Or a=5 на If a<> 3 Then If a <>5 Then - то есть в моём варианте ДВЕ проверки будут только, если первая не прошла, а в штатном ВСЕГДА ДВЕ
И, если на этом примере экономии времени нет (миллисекунды  :D ), то при росте сложности условий и количества проверок уже можно неплохо "заработать"  ;)

Ну а форма записи - уже вкусовщина  :)
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Можно, наверное, и через функции рабочего листа:
Код
' Возвращает True, если в диапазоне r есть ошибочные значения
Function ErrExists(ByVal r As Range) As Boolean
  On Error Resume Next
  Application.WorksheetFunction.Max (Application.Intersect(r, r.Parent.UsedRange))
  ErrExists = Err.Number <> 0
  On Error GoTo 0
End Function

Sub Test()
  Debug.Print ErrExists(Range("A:Z"))
End Sub
Изменено: sokol92 - 15.10.2021 16:45:24
Владимир
 
sokol92, Вас тоже дядь Миша научил не выключать обработчик ошибок в конце функции? :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Jack Famous написал:
Вас тоже дядь Миша
Я сам учитель.  :)  
Владимир
 
Цитата
sokol92: Я сам  учитель
а я даже активно поучаствовал в той дискуссии  :D
Совсем забыл  :) Спасибо!  :idea:

Так раз вы знаете, то почему не выключаете? В чём секрет?  :)
Изменено: Jack Famous - 15.10.2021 16:22:37
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Исправил.
Владимир
 
Можно использовать range.SpecialCells(xlCellTypeFormulas, xlErrors)

Код
Function ErrExists(r As Range) As Boolean
On Error Resume Next
ErrExists = Not Intersect(r, r.SpecialCells(xlCellTypeFormulas, xlErrors)) Is Nothing
On Error GoTo 0
End Function
Изменено: БМВ - 15.10.2021 20:58:40
По вопросам из тем форума, личку не читаю.
Страницы: 1
Наверх