Найти в Дзене
Макрос решает

Найдите ошибки в Excel одной кнопкой — VBA сам подсветит проблемные ячейки

Найдите ошибки в Excel одной кнопкой — и перестаньте вылавливать их глазами по полчаса. Подробно разбираем, как через VBA автоматически находить ошибки в таблице Excel: пустые ячейки, отрицательные суммы, дубликаты и некорректные значения. Готовый макрос, разбор кода и примеры для реальной работы. Открываешь таблицу. Смотришь в столбцы. Ищешь пустые ячейки. Проверяешь, не уехала ли дата. Не попала ли в сумму буква вместо числа. Не повторяется ли номер заказа. Не стоит ли где-то минус там, где его быть не должно. Потом ещё раз проходишь глазами. Потом начинаешь сомневаться. Потом зовёшь коллегу: “Глянь, пожалуйста, ничего не пропустил?” А коллега смотрит с тем же лицом, с каким люди обычно смотрят на сломанный чайник в понедельник утром. И вот в этом месте начинается настоящая цена ручной проверки. Не в том, что она долго идёт. А в том, что глаз замыливается. Через десять минут таблица перестаёт быть набором данных и превращается в серо-белый ковёр, где ошибка может лежать прямо перед н
Оглавление

Найдите ошибки в Excel одной кнопкой — и перестаньте вылавливать их глазами по полчаса. Подробно разбираем, как через VBA автоматически находить ошибки в таблице Excel: пустые ячейки, отрицательные суммы, дубликаты и некорректные значения. Готовый макрос, разбор кода и примеры для реальной работы.

Есть работа, которая утомляет не тяжестью, а тупой повторяемостью.

Открываешь таблицу. Смотришь в столбцы. Ищешь пустые ячейки. Проверяешь, не уехала ли дата. Не попала ли в сумму буква вместо числа. Не повторяется ли номер заказа. Не стоит ли где-то минус там, где его быть не должно. Потом ещё раз проходишь глазами. Потом начинаешь сомневаться. Потом зовёшь коллегу: “Глянь, пожалуйста, ничего не пропустил?” А коллега смотрит с тем же лицом, с каким люди обычно смотрят на сломанный чайник в понедельник утром.

И вот в этом месте начинается настоящая цена ручной проверки.

Не в том, что она долго идёт. А в том, что глаз замыливается. Через десять минут таблица перестаёт быть набором данных и превращается в серо-белый ковёр, где ошибка может лежать прямо перед носом и спокойно ухмыляться.

Поэтому одна из самых полезных автоматизаций в Excel — это макрос, который сам проходит по таблице и выделяет проблемные ячейки. Не думает за вас, не заменяет здравый смысл, а делает самое скучное и однообразное: проверяет заданные правила и помечает то, что выбивается.

И вот это уже действительно рабочий инструмент. Потому что он снимает с человека не анализ, а рутину. А рутина — вещь коварная. Она крадёт время тихо, как сквозняк в старом доме.

Какие ошибки чаще всего прячутся в обычных таблицах

Почти всегда набор один и тот же.

  • Где-то пустая ячейка в обязательном столбце. Например, заказ есть, а дата пустая. Или имя клиента есть, а сумма не указана.
  • Где-то вместо числа стоит текст. Визуально ячейка выглядит нормально, но формулы потом начинают вести себя так, будто таблицу собирали в тумане.
  • Где-то отрицательная сумма, хотя по логике её быть не должно.
  • Где-то дубликат: один и тот же номер документа, один и тот же артикул, один и тот же клиентский ID.
  • Где-то дата в странном формате. Где-то пробел вместо значения. Где-то ошибка формулы. Где-то в столбце с процентами внезапно оказывается 1450.

Проблема в том, что Excel не всегда воспринимает это как ошибку. Для него всё честно: вы ввели данные — он их принял. А то, что по бизнес-логике это чепуха, — уже ваша забота.

Вот почему обычная визуальная проверка быстро упирается в потолок. Человек смотрит на внешнюю форму. VBA может смотреть на правило.

И это большая разница.

Что мы сделаем в этой части

Мы создадим макрос, который проверяет таблицу и подсвечивает ошибки по нескольким понятным условиям. Например:

  • пустые ячейки в обязательных столбцах
  • отрицательные суммы
  • нечисловые значения там, где должны быть числа
  • дубликаты в столбце с номером заказа
  • ошибки формул

После запуска макрос пройдёт по строкам, найдёт подозрительные места и выделит их цветом. А в конце покажет, сколько проблем он нашёл.

Это не “умная нейросеть” и не фантастика. Это нормальная рабочая автоматизация, которая экономит массу времени в реальных файлах.

Представим живую таблицу

Допустим, у нас есть лист с данными, где:

  • в столбце A — номер заказа
  • в столбце B — клиент
  • в столбце C — товар
  • в столбце D — сумма
  • в столбце E — дата

То есть таблица начинается с первой строки как шапки, а данные идут со второй.

Теперь сформулируем простые правила:

  • номер заказа не должен быть пустым
  • клиент не должен быть пустым
  • сумма должна быть числом и не должна быть отрицательной
  • дата должна быть заполнена
  • номер заказа не должен повторяться
Макрос решает

Если хотя бы одно из условий нарушено, ячейку нужно выделить.

Базовый макрос для поиска ошибок

Вот первый рабочий вариант.

Sub ПроверитьТаблицу()
Dim ws As Worksheet*
Dim LastRow As Long*
Dim i As Long*
Dim Ошибок As Long*
Dim dict As Object*
Set ws = Worksheets("Данные")*
Set dict = CreateObject("Scripting.Dictionary")*
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row*
ws.Range("A2:E" & LastRow).Interior.ColorIndex = xlNone*
Ошибок = 0*
For i = 2 To LastRow*
If Trim(ws.Cells(i, "A").Value) = "" Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "B").Value) = "" Then*
ws.Cells(i, "B").Interior.Color = RGB(255, 199, 206)
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "E").Value) = "" Then*
ws.Cells(i, "E").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Not IsNumeric(ws.Cells(i, "D").Value) Or ws.Cells(i, "D").Value < 0 Then*
ws.Cells(i, "D").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "A").Value) <> "" Then*
If dict.exists(ws.Cells(i, "A").Value) Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 235, 156)*
ws.Cells(dict(ws.Cells(i, "A").Value), "A").Interior.Color = RGB(255, 235, 156)*
Ошибок = Ошибок + 1*
Else*
dict.Add ws.Cells(i, "A").Value, i*
End If*
End If*
Next i*
MsgBox "Проверка завершена. Найдено ошибок: " & Ошибок, vbInformation, "Готово"*
End Sub

Уже этот макрос делает много полезного.

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

И всё это за один запуск.

Что здесь происходит на человеческом языке

Строка с листом:

Set ws = Worksheets("Данные")

Говорит Excel, на каком листе искать таблицу. Если у вас лист называется иначе, нужно поставить его имя.

Строка со словарём:

Set dict = CreateObject("Scripting.Dictionary")

Создаёт объект для проверки дубликатов. Словарь запоминает уже встреченные значения. Если тот же номер заказа попадается снова, макрос понимает: перед ним повтор.

Строка:

LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

Находит последнюю заполненную строку в столбце A. Это позволяет не ограничиваться жёстким диапазоном вроде до сотой строки, а проверять реальный объём данных.

Строка:

ws.Range("A2:E" & LastRow).Interior.ColorIndex = xlNone

Снимает прежнюю заливку в диапазоне проверки. Иначе после второго запуска вы получите археологию старых ошибок вперемешку с новыми.

Потом начинается цикл:

For i = 2 To LastRow

Макрос идёт по всем строкам, начиная со второй. Первая строка считается заголовком.

Макрос решает

Дальше идут условия.

  • Если в A пусто — выделяем.
  • Если в B пусто — выделяем.
  • Если в E пусто — выделяем.
  • Если в D не число или число меньше нуля — выделяем.
  • Если номер заказа уже встречался — выделяем оба повторяющихся значения жёлтым.

Цвета можно сделать разными специально. Красный — для ошибок заполнения и логики. Жёлтый — для дубликатов. Так таблица сразу становится читаемой.

Почему это лучше, чем условное форматирование

Иногда на этом месте говорят: “А зачем VBA? Разве нельзя всё сделать обычным условным форматированием?”

Иногда можно. Но не всегда удобно.

Условное форматирование хорошо, когда правило простое и статичное. Например, подсветить значения больше 100 или пустые ячейки в одном диапазоне.

Но как только вы хотите:

  • проверять несколько разных условий сразу
  • считать ошибки
  • работать с дубликатами гибко
  • выделять разные типы проблем разными цветами
  • запускать проверку по кнопке
  • добавлять сообщения, отчёт или журнал ошибок
  • VBA становится заметно сильнее.

Он хорош именно там, где проверка должна быть не “постоянным фоном”, а конкретным действием по сценарию. Нажали кнопку — получили результат.

Улучшим макрос: добавим проверку ошибок формул

Теперь сделаем следующий шаг.

Иногда проблема сидит не в данных, а в формулах. Например, в ячейке ошибка #Н/Д, #ДЕЛ/0!, #ЗНАЧ! или любая другая неприятность, которая потом тянется дальше по отчёту, как трещина по стеклу.

Добавим отдельную проверку.

Sub ПроверитьТаблицу()
Dim ws As Worksheet*
Dim LastRow As Long*
Dim i As Long*
Dim Ошибок As Long*
Dim dict As Object*
Set ws = Worksheets("Данные")*
Set dict = CreateObject("Scripting.Dictionary")*
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row*
ws.Range("A2:E" & LastRow).Interior.ColorIndex = xlNone*
Ошибок = 0*
For i = 2 To LastRow*
If Trim(ws.Cells(i, "A").Value) = "" Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "B").Value) = "" Then*
ws.Cells(i, "B").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "E").Value) = "" Then*
ws.Cells(i, "E").Interior.Color = RGB(255, 199, 206)
Ошибок = Ошибок + 1*
End If*
If IsError(ws.Cells(i, "D").Value) Then*
ws.Cells(i, "D").Interior.Color = RGB(255, 0, 0)*
Ошибок = Ошибок + 1
ElseIf Not IsNumeric(ws.Cells(i, "D").Value) Or ws.Cells(i, "D").Value < 0 Then*
ws.Cells(i, "D").Interior.Color = RGB(255, 199, 206)*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "A").Value) <> "" Then*
If dict.exists(ws.Cells(i, "A").Value) Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 235, 156)*
ws.Cells(dict(ws.Cells(i, "A").Value), "A").Interior.Color = RGB(255, 235, 156)*
Ошибок = Ошибок + 1*
Else*
dict.Add ws.Cells(i, "A").Value, i*
End If*
End If*
Next i*
MsgBox "Проверка завершена. Найдено ошибок: " & Ошибок, vbInformation, "Готово"*
End Sub

Теперь, если в сумме не просто странное значение, а настоящая ошибка формулы, ячейка будет выделяться более жёстким цветом.

Это уже удобно в живых таблицах, где часть значений считается формулами, а не вводится руками.

Когда такой макрос особенно полезен

На самом деле не только в больших отчётах. Он отлично работает там, где данные вносятся вручную несколькими людьми. Например, отдел продаж ведёт заявки. Склад вносит остатки. Менеджеры заполняют номера заказов и суммы. Бухгалтерия собирает реестр. Рекрутеры ведут таблицу кандидатов. Производство отмечает статусы.

Макрос решает

Во всех этих сценариях ошибка редко выглядит драматично. Обычно это что-то мелкое. Пустая дата. Минус в сумме. Повтор номера. Лишний пробел. И именно из таких мелочей потом вырастают кривые итоги, неверные фильтры, странные сводные и разговоры в духе “кто опять это занёс”.

Макрос здесь хорош тем, что не обвиняет, не спорит и не устаёт. Он просто проходит по правилам и показывает, где надо смотреть внимательнее.

Ещё более полезный вариант: выводить тип ошибки в отдельный столбец

Подсветка — это хорошо. Но иногда хочется видеть не только “здесь что-то не так”, а ещё и причину. Для этого можно завести служебный столбец F и записывать туда комментарий.

Например:

  • Пустой номер заказа
  • Не указан клиент
  • Некорректная сумма
  • Дубликат номера заказа
  • Не указана дата

Тогда проверка превращается почти в мини-диагностику.

Вот пример.

Sub ПроверитьТаблицу()
Dim ws As Worksheet*
Dim LastRow As Long*
Dim i As Long*
Dim Ошибок As Long*
Dim dict As Object*
Dim Сообщение As String*
Set ws = Worksheets("Данные")*
Set dict = CreateObject("Scripting.Dictionary")*
LastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row*
ws.Range("A2:F" & LastRow).Interior.ColorIndex = xlNone*
ws.Range("F2:F" & LastRow).ClearContents*
Ошибок = 0*
For i = 2 To LastRow*
Сообщение = ""*
If Trim(ws.Cells(i, "A").Value) = "" Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 199, 206)
Сообщение = Сообщение & "Пустой номер заказа; "*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "B").Value) = "" Then*
ws.Cells(i, "B").Interior.Color = RGB(255, 199, 206)*
Сообщение = Сообщение & "Не указан клиент; "*
Ошибок = Ошибок + 1*
End If*
If Trim(ws.Cells(i, "E").Value) = "" Then*
ws.Cells(i, "E").Interior.Color = RGB(255, 199, 206)*
Сообщение = Сообщение & "Нет даты; "*
Ошибок = Ошибок + 1*
End If*
If IsError(ws.Cells(i, "D").Value) Then*
ws.Cells(i, "D").Interior.Color = RGB(255, 0, 0)*
Сообщение = Сообщение & "Ошибка формулы в сумме; "*
Ошибок = Ошибок + 1*
ElseIf Not IsNumeric(ws.Cells(i, "D").Value) Or ws.Cells(i, "D").Value < 0 Then*
ws.Cells(i, "D").Interior.Color = RGB(255, 199, 206)*
Сообщение = Сообщение & "Некорректная сумма; "*
Ошибок = Ошибок + 1*
End I
If Trim(ws.Cells(i, "A").Value) <> "" Then*
If dict.exists(ws.Cells(i, "A").Value) Then*
ws.Cells(i, "A").Interior.Color = RGB(255, 235, 156)*
ws.Cells(dict(ws.Cells(i, "A").Value), "A").Interior.Color = RGB(255, 235, 156)*
Сообщение = Сообщение & "Дубликат номера заказа; "*
Ошибок = Ошибок + 1*
Else*
dict.Add ws.Cells(i, "A").Value, i*
End If*
End If*
ws.Cells(i, "F").Value = Сообщение*
Next i*
ws.Cells(1, "F").Value = "Результат проверки"*
MsgBox "Проверка завершена. Найдено ошибок: " & Ошибок, vbInformation, "Готово"*
End Sub

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

Что можно проверить кроме пустых полей и дубликатов

На этом месте макрос только начинается. Почти в любой рабочей таблице можно добавить свои правила. Например:

  • сумма не должна быть больше определённого лимита
  • дата не должна быть позже сегодняшнего дня
  • процент не должен быть меньше нуля и больше ста
  • артикул должен иметь нужную длину
  • телефон должен содержать заданное число символов
  • email должен содержать значок @
  • статус должен входить в разрешённый список
  • количество не должно быть дробным
  • код подразделения должен начинаться с нужных букв

И в этом вся прелесть VBA. Он не пытается навязать вам чужую систему. Он позволяет взять вашу логику работы и описать её в виде понятных условий.

Макрос решает

Фактически вы учите Excel проверять таблицу так, как это сделал бы внимательный сотрудник. Только без усталости и без желания налить себе пятую кружку кофе.

Как сделать кнопку проверки на листе

Лучший вариант — вынести этот макрос на кнопку прямо в таблицу. Потому что проверка — это действие, которое хочется запускать быстро и без захода в редактор VBA.

Сделали кнопку Проверить таблицу — и всё. Перед отправкой отчёта, перед сохранением, перед созданием новой версии файла нажали один раз и сразу увидели слабые места.

Такой сценарий особенно хорош в связке с предыдущими частями серии. Сначала одна кнопка очищает рабочую таблицу. Потом другая создаёт отчёт. Теперь третья проверяет данные на ошибки. И Excel начинает вести себя уже не как обычный лист, а как аккуратный рабочий инструмент.

Если вы пропустили прошлые части серии, посмотрите их на канале: сначала мы разбирали кнопку очистки таблицы, потом автоматическое создание отчёта. В связке с текущей проверкой это уже даёт очень сильную базу для реальной автоматизации в Excel. Такой формат серии полностью совпадает с подходом, который закреплён в правилах проекта: практическая польза, живой язык, длинная прикладная статья и понятный файл для внедрения.

Типичные ошибки при создании таких проверок

  • Первая ошибка — выбирать для поиска последней строки столбец, который может быть пустым.
    Если вы ищете конец таблицы по столбцу A, а A у вас иногда не заполнен, макрос может остановиться раньше времени. Лучше опираться на тот столбец, где данные есть всегда.
  • Вторая ошибка — не очищать старую подсветку перед новой проверкой.
    Тогда после нескольких запусков таблица превращается в музей прошлых тревог, и уже непонятно, что ошибка сейчас, а что было вчера.
  • Третья ошибка — проверять числа слишком грубо.
    Например, значение может быть текстом, который выглядит как число. Здесь полезно тестировать данные на ваших реальных таблицах, а не только на красивом учебном примере.
  • Четвёртая ошибка — не учитывать пробелы.
    Иногда ячейка кажется заполненной, но там один пробел. Для глаза она почти пустая, а для Excel — уже нет. Поэтому
    Trim здесь очень полезен.
  • Пятая ошибка — пытаться сразу построить гигантскую систему на двадцать условий.
    Лучше начать с четырёх-пяти правил, которые действительно важны, а потом расширять. В хорошей автоматизации, как и в хорошей сантехнике, сначала нужен надёжный узел, а не бронзовый фонтан в гостиной.

Где этот макрос даёт самый заметный эффект

Не там, где таблица маленькая и идеальная, а там, где есть поток. Поток заявок, отчётов, ручного ввода и правок от нескольких людей. Поток повторяющихся действий, из-за которых внимание расползается, как старая изолента.

Макрос решает

Именно в таких местах автоматическая проверка чувствуется сильнее всего. Потому что вы экономите не только минуты, но и внутренние силы. Вам больше не нужно идти по таблице глазами с тревожной мыслью: “Лишь бы не пропустить какую-нибудь ерунду”.

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

Как адаптировать макрос под свои таблицы

Самый правильный подход — не переписывать всё, а заменить правила под свои данные. Если у вас не заказы, а сотрудники — проверяете табельный номер, ФИО, дату, отдел.

  • Если у вас склад — проверяете артикул, количество, цену, остаток.
  • Если у вас финансы — проверяете статью расходов, сумму, дату, центр затрат.
  • Если у вас подбор персонала — проверяете имя кандидата, источник, статус, телефон, email.

То есть каркас остаётся тем же:

  • идём по строкам
  • смотрим условия
  • подсвечиваем проблемы
  • считаем ошибки
  • по желанию пишем комментарий в отдельный столбец

Вот за это VBA и любят. Он не требует жить по чужому шаблону. Он позволяет заставить Excel работать по правилам именно вашей рутины.

Что в итоге даёт такая кнопка

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

Это не заменяет человека, но делает его сильнее. Убирает скучную часть процесса и оставляет главное: понять, почему возникла ошибка и как её исправить. А это уже совсем другой уровень работы.

В следующей части серии мы разберём ещё более полезный сценарий: как одной кнопкой собирать данные с разных листов в одну общую таблицу. Вот там Excel уже начинает экономить не минуты, а приличные куски рабочего дня.

Если хотите собрать себе такой набор полезных автоматизаций, подписывайтесь на канал в Дзене.
Файл с примером таблицы и готовым макросом будет в Telegram. И не забудьте подписаться на канал.

Макрос решает