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

Проверь таблицу в Excel перед отправкой одной кнопкой — VBA-макрос против ошибок

Проверь таблицу перед отправкой одной кнопкой — VBA-макрос, который ловит пустые ячейки, ошибки и опасные мелочи. Как автоматически проверять таблицу перед отправкой в Excel с помощью VBA. Пустые ячейки, ошибки, дубли, пропуски и готовый макрос с разбором. Есть особый вид офисного напряжения, который знаком почти всем, кто работает с Excel регулярно. Файл уже готов. Таблица вроде бы собрана. Формулы стоят. Цвета красивые. Лист назван прилично, не “Новый файл 17”. Остаётся одно — отправить. И вот в этот момент начинает скрестись неприятная мысль. А точно всё проверено? Не пропущена ли сумма.
Не осталась ли пустая ячейка в важном столбце.
Не уехала ли формула.
Не попал ли в файл текст “потом проверить”.
Не остались ли ошибки #Н/Д, #ДЕЛ/0! или ещё какая-нибудь мелкая пакость, которая всплывёт уже у начальника, клиента или бухгалтера. Это тот самый момент, где Excel перестаёт быть просто таблицей и становится минным полем. Внешне всё спокойно. А внутри сидят мелкие ошибки, которые ждут сво
Оглавление

Проверь таблицу перед отправкой одной кнопкой — VBA-макрос, который ловит пустые ячейки, ошибки и опасные мелочи. Как автоматически проверять таблицу перед отправкой в Excel с помощью VBA. Пустые ячейки, ошибки, дубли, пропуски и готовый макрос с разбором.

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

Файл уже готов. Таблица вроде бы собрана. Формулы стоят. Цвета красивые. Лист назван прилично, не “Новый файл 17”. Остаётся одно — отправить.

И вот в этот момент начинает скрестись неприятная мысль.

А точно всё проверено?

Не пропущена ли сумма.
Не осталась ли пустая ячейка в важном столбце.
Не уехала ли формула.
Не попал ли в файл текст “потом проверить”.
Не остались ли ошибки #Н/Д, #ДЕЛ/0! или ещё какая-нибудь мелкая пакость, которая всплывёт уже у начальника, клиента или бухгалтера.

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

Обычно проверка перед отправкой выглядит уныло и знакомо.

Человек начинает глазами проходить по строкам. Листать вниз. Смотреть, не пусто ли где-то. Прокликивать формулы. Сортировать. Фильтровать. Искать взглядом то, что легко пропустить даже на небольшом листе. Если строк 50 — ещё можно жить. Если 500 — уже начинается лотерея. Если 5000 — это не проверка, а самообман с деловым лицом.

И самое обидное здесь даже не в том, что на проверку уходит время. Обиднее другое: после 10–15 минут ручного просмотра внимание тупеет. Глаз замыливается. Мозг уже не ищет ошибку, а просто хочет поскорее закончить. И ровно в этот момент в отправку уходит файл, где:

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

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

И вот именно такие задачи VBA решает лучше человека.

Почему ручная проверка почти всегда проигрывает

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

Ручная проверка плоха не потому, что люди глупые. Она плоха потому, что люди устают, торопятся и не любят повторяющиеся действия. Особенно те, в которых нет ничего творческого.

Когда ты проверяешь таблицу руками, ты вынужден держать в голове сразу несколько правил:

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

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

Есть и ещё одна проблема.

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

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

Вот такой подход и нужен перед отправкой.

Что обычно делают неправильно

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

Перелом: файл перед отправкой должен проходить техосмотр

Вот здесь начинается правильная логика.

Не надо “просматривать таблицу”. Надо прогонять её по правилам.

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

То есть перед отправкой макрос должен пройти по таблице и ответить на несколько простых, но важных вопросов:

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

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

И да, это как раз тот случай, где одна кнопка окупает себя очень быстро.

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

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

Что будет делать наш макрос

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

A — Дата
B — Номер документа
C — Клиент
D — Менеджер
E — Сумма
F — Статус

Перед отправкой файла мы хотим:

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

Смысл здесь не в том, чтобы написать “умный код ради умного кода”. Смысл в том, чтобы убрать тупую ручную рутину, которая жрёт время и при этом всё равно не даёт гарантии.

VBA-код: кнопка проверки таблицы перед отправкой

Ниже — рабочий макрос для листа Данные. Он очищает старую заливку, проходит по строкам и подсвечивает проблемные места.

Sub ПроверитьТаблицуПередОтправкой()
Dim ws As Worksheet*
Dim lastRow As Long*
Dim i As Long*
Dim errorCount As Long*
Dim docDict As Object*
Dim docNumber As String*
Set ws = ThisWorkbook.Sheets("Данные")*
Set docDict = CreateObject("Scripting.Dictionary")*
Application.ScreenUpdating = False*
errorCount = 0*
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row*
ws.Range("A2:F" & lastRow).Interior.ColorIndex = xlNone*
For i = 2 To lastRow*
If Trim(ws.Cells(i, 1).Value) = "" Then*

ws.Cells(i, 1).Interior.Color = RGB(255, 199, 206)*

errorCount = errorCount + 1*

End If*

If Trim(ws.Cells(i, 2).Value) = "" Then*

ws.Cells(i, 2).Interior.Color = RGB(255, 199, 206)*

errorCount = errorCount + 1*

End If*

If Trim(ws.Cells(i, 3).Value) = "" Then*

ws.Cells(i, 3).Interior.Color = RGB(255, 199, 206)*

errorCount = errorCount + 1*

End If*

If Trim(ws.Cells(i, 4).Value) = "" Then*

ws.Cells(i, 4).Interior.Color = RGB(255, 199, 206)*

errorCount = errorCount + 1*

End If*

If IsError(ws.Cells(i, 5).Value) Then*

ws.Cells(i, 5).Interior.Color = RGB(255, 235, 156)*

errorCount = errorCount + 1*

ElseIf ws.Cells(i, 5).Value < 0 Then*

ws.Cells(i, 5).Interior.Color = RGB(255, 235, 156)*

errorCount = errorCount + 1*

End If*

If Trim(ws.Cells(i, 6).Value) = "" Then*

ws.Cells(i, 6).Interior.Color = RGB(255, 199, 206)*

errorCount = errorCount + 1*

End If*

docNumber = Trim(ws.Cells(i, 2).Value)*

If docNumber <> "" Then*

If docDict.exists(docNumber) Then*

ws.Cells(i, 2).Interior.Color = RGB(255, 235, 156)*

ws.Cells(docDict(docNumber), 2).Interior.Color = RGB(255, 235, 156)*

errorCount = errorCount + 1*

Else*

docDict.Add docNumber, i*

End If*

End If*

Next i*
Application.ScreenUpdating = True*
If errorCount = 0 Then*
MsgBox "Проверка завершена. Ошибок не найдено, файл можно отправлять.", vbInformation*

Else*
MsgBox "Проверка завершена. Найдено проблем: " & errorCount & ". Исправьте подсвеченные ячейки.", vbExclamation*

End If*
End Sub

Что здесь происходит на самом деле

На первый взгляд код выглядит как строгий охранник у проходной. И это хорошо. Нам как раз такой и нужен.

Сначала выбирается лист:

Set ws = ThisWorkbook.Sheets("Данные")

То есть вся проверка будет идти именно на нём. Если у тебя лист называется “Отчёт”, “Заявки” или “Реестр”, меняешь имя — и всё.

Потом создаётся словарь:

Set docDict = CreateObject("Scripting.Dictionary")

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

Дальше определяется последняя строка:

lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row

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

Следующая строка очень важна:

ws.Range("A2:F" & lastRow).Interior.ColorIndex = xlNone

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

Потом начинается цикл по строкам.

Внутри него идёт серия простых, но полезных проверок.

Проверка пустых обязательных ячеек

Например, дата:

If Trim(ws.Cells(i, 1).Value) = "" Then

Если ячейка пустая, она подсвечивается мягким красным цветом. Так же проверяются номер документа, клиент, менеджер и статус. Смысл не в красоте. Смысл в том, чтобы проблема не пряталась в тумане таблицы.

Проверка суммы

Вот здесь уже интереснее.

If IsError(ws.Cells(i, 5).Value) Then

Сначала макрос проверяет, не сидит ли в сумме ошибка формулы. Если да — подсветка.

Если ошибки формулы нет, идём дальше:

ElseIf ws.Cells(i, 5).Value < 0 Then

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

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

Проверка дублей

Дальше макрос берёт номер документа:

docNumber = Trim(ws.Cells(i, 2).Value)

Если он не пустой, макрос спрашивает у словаря: видел ли он такой номер раньше.

Если видел — подсвечиваются обе ячейки с дублирующимся номером. Если нет — номер запоминается.

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

Почему такой макрос полезнее ручного просмотра

Потому что он не спорит, не торопится и не устает. В этом весь секрет.

Он не думает: “Ай, ладно, вроде всё нормально”. Он просто проходит по набору правил. Каждый раз одинаково. И это как раз то, чего не хватает ручной проверке.

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

Сценарий 1 — коммерческий отдел

Есть таблица с заявками, суммами, статусами, ответственными. Перед тем как отправить файл руководителю или в смежный отдел, его надо проверить. Обычно это делают на глаз. И именно поэтому потом появляются вопросы: почему нет менеджера, откуда дубль, почему пустой статус.

Макрос решает вопрос в лоб. Нажал кнопку — сразу видно, где слабые места. Не надо выискивать их вручную.

Сценарий 2 — бухгалтерия и документы

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

Сценарий 3 — подготовка отчёта для клиента

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

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

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

Что ещё можно добавить в этот макрос

Вот здесь начинается следующий уровень.

1. Проверка служебных слов

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

2. Проверка длины номера документа

Если номер должен быть, например, ровно из 8 символов, это легко добавить. Тогда макрос будет отлавливать и обрезанные, и криво введённые значения.

3. Проверка допустимых статусов

Допустим, у тебя разрешены только значения:

Новый
В работе
Оплачен
Закрыт

Если кто-то написал “готово”, “ок”, “потом”, “1” или просто оставил фантазию на воле, макрос может считать это ошибкой. Это уже даёт дисциплину на уровне процесса, а не только файла.

4. Проверка дат

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

5. Автоматическая блокировка отправки

Если делать файл совсем по-взрослому, можно добавить кнопку “Подготовить к отправке”, которая сначала запускает проверку, а потом только при отсутствии ошибок разрешает следующий шаг. Это уже почти корпоративная гигиена, а не просто удобство.

Ошибки, которые могут сломать саму проверку

Теперь честно про подводные камни.

Ошибка 1. Неправильное имя листа

Самая частая мелочь. В коде “Данные”, у тебя “Реестр” — и макрос не найдёт лист. Поэтому имя должно совпадать точно.

Ошибка 2. Проверка идёт не по тому столбцу

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

Ошибка 3. Отрицательная сумма в твоём процессе допустима

Тогда эту часть проверки надо менять. Не надо слепо тащить макрос как есть. Автоматизация должна подчиняться логике бизнеса, а не наоборот.

Ошибка 4. Дубли должны быть не по номеру документа, а по сочетанию полей

Иногда один номер сам по себе ещё не дубликат. Иногда важна связка “дата + номер + клиент”. Это тоже можно сделать, но уже чуть сложнее. Базовый вариант с одним полем — хорошая отправная точка.

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

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

Меняешь:

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

И получаешь не “абстрактный пример из интернета”, а свой рабочий инструмент. Тот самый, который потом экономит время каждый день.

В этом и есть нормальная философия VBA. Не “вау, у меня есть код”. А “я убрал рутину, которая раньше бесила”.

Почему такая статья полезна для серии

Потому что она про реальную боль, а не про учебный макрос из вакуума.

Люди в Excel редко страдают от нехватки кнопок. Они страдают от повторяющихся мелких ошибок, которые воруют время и портят впечатление от работы. А проверка перед отправкой — это как раз то место, где автоматизация ощущается сразу. Без теории. Без длинной адаптации. Без сложного внедрения.

Ты один раз написал макрос. А потом много раз избежал позорной правки после отправки. Вот это уже честная польза.

Итог

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

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

И именно такие алгоритмы постепенно превращают Excel из места постоянного ручного напряжения в инструмент, который работает на тебя, а не против тебя.

Не забудь подписаться на нас здесь и в Телеграм

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