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

Надёжные макросы VBA в Excel: как писать код, который не ломается и работает годами. ЧАСТЬ 4

Макрос, который не ломается: как сделать VBA-код устойчивым, понятным и готовым к кнопке запуска. Разбираем, как улучшить макросы Excel: автоматические имена листов, устойчивый код VBA, отказ от жёстких ссылок и подготовка к запуску одной кнопкой. На прошлых шагах мы сделали многое: — фильтруем данные
— работаем с массивами
— создаём файлы
— сохраняем и закрываем книги Формально — задача решена. Но есть проблема, которую новички замечают слишком поздно. Макрос: — работает только в одном файле
— ломается при малейшем изменении
— путается в активных листах
— ведёт себя непредсказуемо Такой макрос живёт один отчёт. Хороший макрос живёт годами. Запомните простое правило: Excel всегда должен точно понимать, с чем он работает Самая частая причина ошибок в VBA: — ActiveSheet
— ActiveWorkbook
— Selection Пока макрос маленький — всё нормально. Как только логика усложняется — начинаются сюрпризы. Когда вы пишете: │ ActiveSheet.Range("A1:F60").Copy Вы говорите Excel: «Скопируй данные с того листа
Оглавление

Макрос, который не ломается: как сделать VBA-код устойчивым, понятным и готовым к кнопке запуска. Разбираем, как улучшить макросы Excel: автоматические имена листов, устойчивый код VBA, отказ от жёстких ссылок и подготовка к запуску одной кнопкой.

Почему «рабочий макрос» — ещё не хороший макрос

На прошлых шагах мы сделали многое:

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

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

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

Такой макрос живёт один отчёт. Хороший макрос живёт годами.

Главный принцип устойчивых макросов

Запомните простое правило:

Excel всегда должен точно понимать, с чем он работает

Самая частая причина ошибок в VBA:

— ActiveSheet
— ActiveWorkbook
— Selection

Пока макрос маленький — всё нормально. Как только логика усложняется — начинаются сюрпризы.

Почему ActiveSheet — это мина замедленного действия

Когда вы пишете:

│ ActiveSheet.Range("A1:F60").Copy

Вы говорите Excel:

«Скопируй данные с того листа, который сейчас активен»

Но:

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

И код внезапно начинает работать не там.

Первый шаг к устойчивости: фиксируем лист

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

│ Set SrcSheet = ThisWorkbook.Sheets("Выгрузка")

Теперь Excel знает:

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

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

Дальше в коде мы работаем уже с SrcSheet.

Как выглядит код с явным указанием листа

Было:

│ ActiveSheet.Range("$A$1:$F$60").AutoFilter Field:=5, Criteria1:=WS

Стало:

│ SrcSheet.Range("$A$1:$F$60").AutoFilter Field:=5, Criteria1:=WS

Это маленькое изменение, но именно оно отличает учебный макрос от рабочего инструмента.

Автоматическое имя листа: убираем ручной бардак

В прошлых версиях Excel создавал листы с именами:

— Лист1
— Лист2
— Лист3

Это неудобно и опасно. Нам нужно, чтобы лист сразу назывался по региону.

Как задать имя листа в VBA

После создания листа добавляем команду:

│ ActiveSheet.Name = WS

Теперь Excel:

— создаёт лист
— сразу называет его «ВЛГ», «МСК» и т.д.

Без ручных переименований. Без ошибок. Без дубликатов.

Что делать, если лист с таким именем уже существует

Очень важный момент. Если макрос запустить второй раз — Excel выдаст ошибку:

Лист с таким именем уже существует

Есть два варианта:

— удалять старые листы
— или пропускать существующие

Для новичков безопаснее удалять старые.

Удаление листа без вопросов Excel

Обычно Excel спрашивает:

Вы уверены, что хотите удалить лист?

Для макроса это недопустимо.

Поэтому:

Application.DisplayAlerts = False
Sheets(WS).Delete
Application.DisplayAlerts = True
Макрос решает

Теперь Excel:

— не задаёт вопросов
— молча удаляет лист
— продолжает работу

Собираем устойчивый макрос целиком

Теперь объединяем всё, что сделали ранее.

Sub StableRegionMacro()
Dim SrcSheet As Worksheet
Set SrcSheet = ThisWorkbook.Sheets("Выгрузка")
Regions = Array("ВЛГ", "МСК", "САМ")
For Each WS In Regions
On Error Resume Next
Sheets(WS).Delete
On Error GoTo 0
SrcSheet.Range("$A$1:$F$60").AutoFilter Field:=5, Criteria1:=WS
SrcSheet.Range("A1:F60").Copy
Sheets.Add After:=Sheets(Sheets.Count)
ActiveSheet.Name = WS
ActiveSheet.Paste
Application.CutCopyMode = False
Next WS
MsgBox "Готово"
End Sub

Что делает этот код:

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

Это уже «чистый» VBA

На этом этапе код:

— читается
— поддерживается
— легко расширяется
— не пугает через месяц

Именно так выглядят макросы, которые:

— передают коллегам
— используют годами
— запускают без страха

👉 Подписывайтесь на канал в Дзен и Телеграм и пишите в комментариях, хотите ли вы отдельный разбор ошибок VBA и отладки макросов — это одна из самых полезных тем.

В ЧАСТИ 5 мы:

— создадим кнопку запуска макроса
— разберём, как сохранить файл правильно (.xlsm)
— покажем типичные ошибки при распространении
— соберём всё в завершённую систему

Это финальный уровень: нажал кнопку — Excel всё сделал сам.

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