Страницы: 1
RSS
vba подсветить ячейки с ошибками и вывести их адреса
 
День добрый!
Обрабатываю большие цифро-буквенные массивы. Основной метод For Next IF. Полей много, для каждого свое условие. В данных встречаются разнообразные ошибки, на которых макрос спотыкается. Я сам могу отследить ошибку и поправить данные, потом перезапустить макрос. Но макрос нужен и пользователям, не владеющим vba.
Хочется сделать контроль ошибок без прерывания выполнения макроса. Чтобы после его выполнения все ячейки с ошибочными данными были подсвечены и выводились сообщения о количестве ошибок и их местоположении.
Увы, знаний vba на создание условий хватает, а на обработку ошибок - нет.
Прикладываю условный файл примера и код.
ActiveCell и Msgbox конечно же не работают
Код
Sub Err()
    On Error GoTo ErrorHandler
        For i = 1 To 8
            Cells(i, 3) = Cells(i, 1) * 2
        Next i
        For i = 1 To 8
            Cells(i, 4) = Mid(Cells(i, 2), 2, 2) * 3
        Next i
    Exit Sub
ErrorHandler:
    On Error Resume Next
        ActiveCell.Interior.ColorIndex = 46
        MsgBox "Количество ошибок .......", vbCritical
        MsgBox "Ячейки с ошибками .......", vbCritical
    Resume
End Sub
 
Цитата
ixet написал:
В данных встречаются разнообразные ошибки
В Вашем файле нет ячеек с ошибками.
 
Есть. Выделил их красным. По этим ячейкам не отрабатывается код, так как вместо цифр там есть буквы и т.п.
 
Если не сильно вдаваться в технические особенности, то можно и так:
Код
Sub FindErr()
    Dim i As Long, rErr As Range
    
    On Error Resume Next
        For i = 1 To 8
            Cells(i, 3) = Cells(i, 1) * 2
            If Err.Number Then
                If rErr Is Nothing Then
                    Set rErr = Cells(i, 3)
                Else
                    Set rErr = Union(rErr, Cells(i, 3))
                End If
                Err.Clear
            End If
        Next i
        For i = 1 To 8
            Cells(i, 4) = Mid(Cells(i, 2), 2, 2) * 3
            If Err.Number Then
                If rErr Is Nothing Then
                    Set rErr = Cells(i, 3)
                Else
                    Set rErr = Union(rErr, Cells(i, 3))
                End If
                Err.Clear
            End If
        Next i

    If Not rErr Is Nothing Then
        rErr.Interior.ColorIndex = 46
        MsgBox "Количество ошибок:" & rErr.Cells.Count, vbCritical
        MsgBox "Ячейки с ошибками: " & rErr.Address, vbCritical
    End If
End Sub
обратите внимание на название процедуры - нельзя давать процедурам и переменным зарезервированные в VBA и Excel имена(как у Вас например - Err, это зарезервированный объект, содержащий все данные о произошедшей ошибке).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Ещё раз: ячеек с ошибками на листе нет. Везде константы.
Если требуется проверить является ли значение в ячейке числом, то используйте IsNumeric
 
Дмитрий, большое спасибо, но увы, работает не совсем правильно.
1) подсветились не исходные ячейки, как предполагалось, а итоговые.
2) из 5 ошибок подсвечены 4 - 3 верных и 1 неверная
3) первый msgbox дал ответ: 4, второй - адреса только 3 ячеек
4) в исходных данных столбцов (полей) десятки, по каждому свое условие. Хотелось бы обработку ошибок сделать одну на все поля.
Если задача сложная, готов перенести ее в коммерческий раздел (есть еще пара попутных задач).
Изменено: ixet - 16.10.2021 13:56:43
 
Цитата
Юрий М написал:
то используйте IsNumeric
Знаю и использую этот метод.
Конечно, ошибок тила деления на ноль в исходных данных нет, т.к. данные исходные, еще не обработаны.
Ошибками называю ситуацию, когда вместо ожидаемого "3,5" стоит например "3.5"
 
Про ошибки разобрались )
Переносить тему в платный раздел?
 
Давайте. Я, правда, не представляю, какие нынче расценки :)
 
ixet, давайте я попробую вам помочь. Пишу в ЛС
P.S. Расценки сейчас такие - одна строка кода 1000 руб... шутка... хотя...
Изменено: New - 16.10.2021 17:07:30
 
Цитата
ixet написал:
подсветились не исходные ячейки, как предполагалось, а итоговые.
в чем проблема подставить в код формирования диапазона исходные ячейки? Я показал принцип - доработать не проблема. Надо же и смекалку какую-то подключать:
Код
Sub FindErr()
    Dim i As Long, rErr As Range
     
    On Error Resume Next
        For i = 1 To 8
            Cells(i, 3) = Cells(i, 1) * 2
            If Err.Number Then
                If rErr Is Nothing Then
                    Set rErr = Cells(i, 1)
                Else
                    Set rErr = Union(rErr, Cells(i, 1))
                End If
                Err.Clear
            End If
        Next i
        For i = 1 To 8
            Cells(i, 4) = Mid(Cells(i, 2), 2, 2) * 3
            If Err.Number Then
                If rErr Is Nothing Then
                    Set rErr = Cells(i, 2)
                Else
                    Set rErr = Union(rErr, Cells(i, 2))
                End If
                Err.Clear
            End If
        Next i
 
    If Not rErr Is Nothing Then
        rErr.Interior.ColorIndex = 46
        MsgBox "Количество ошибок:" & rErr.Cells.Count, vbCritical
        MsgBox "Ячейки с ошибками: " & rErr.Address, vbCritical
    End If
End Sub
Цитата
ixet написал:
из 5 ошибок подсвечены 4 - 3 верных и 1 неверная
в таких случаях надо указывать почему Вы считаете их неверными. Вы, вероятно, не сделали поправку на то, что подсветились-то результирующие ячейки. А в строке 5 две исходных ячейки с ошибками. Нельзя же дважды подсветить одну ячейку :) Код выше подсвечивает все верно - делов было две цифры подправить.
Цитата
ixet написал:
Хотелось бы обработку ошибок сделать одну на все поля.
учитывая то, что Вы даже две цифры подправить не смогли и разобраться в алгоритме - да, лучше заказать, приложив реальный файл. Потому что обработку придется внедрять в каждую операцию, в которой может быть ошибка. Не говоря уже о возможных нюансах(например, если идет операция сложения 6-ти ячеек и неверное значение только в одной из них. Для корректной подсветки придется каждую из ячеек проверить на число).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
ТС в ЛС сообщил, что не хочет показывать реальные данные... пока я предложил ТС код по словесному описанию его проблем... будем гадать...
Изменено: New - 16.10.2021 17:08:45
 
Цитата
New написал:
будем гадать
удачи
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Мэтры, я же со всем уважением.
Но!
Во-первых, данные ДСП.
Во-вторых, их структура чудовищная и я не могу перечислить все мыслимые ошибки, которые могут встретиться.
Потому и вопрос был про отлов ошибок вообще. Чтобы вначале макроса вставить отлов и подсвечивание любых ошибок!

"Потому что обработку придется внедрять в каждую операцию, в которой может быть ошибка."
- это усложнит код в разы
 
Цитата
ixet написал:
- это усложнит код в разы
а по-другому никак Вы не отловите в какой ячейке была ошибка. Говорю Вам по опыту. В объект Err не передается конкретный объект, вызвавший ошибку. Там только номер, описание, еще пара пунктов, но ни один не даст понимания в какой ячейке это было.
Правильнее всего вообще при первой же ошибке показывать на эту ячейку и говорить - "ой, тут ошибка, дальше работать не буду. Исправьте и продолжите". И запоминать на какой итерации произошла ошибка, чтобы после исправления и нажатия "Продолжить" не шерстить весь массив сначала.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
В объект Err не передается конкретный объект, вызвавший ошибку. Там только номер,
спасибо, Дмитрий, понял
очередные ограничения VB

с New Пользователь обсудим
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
говорить - "ой, тут ошибка, дальше работать не буду. Исправьте и продолжите". И запоминать на какой итерации произошла ошибка
Это вариант если ошибок одна-две-пять.
А если это системная ошибка по всему столбцу? Тогда проще до макроса поиском-заменой все ошибки устранить.
 
Цитата
ixet написал:
А если это системная ошибка по всему столбцу?
ну тут
Цитата
ixet написал:
с  New  Пользователь обсудим
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
без файла у меня не вышло )
 
Цитата
ixet написал:
очередные ограничения VB
чем меньше знаний в области эксплуатации VBA, тем больше ограничений
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Все ошибки выловил. Оказалось достаточно вдумчиво применить IsNumeric.

New Пользователь - спасибо за решение попутной задачи
Изменено: ixet - 31.10.2021 14:51:22
 
Цитата
ixet: New Пользователь
давно не новый :D
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Страницы: 1
Наверх