Создание кода VBA — ИИ-помощник онлайн нейросети Аливия. Напишет макрос для Excel, Word или Outlook по описанию обычными словами: свод из десятков файлов, выгрузка в PDF, подсветка дублей и пустых полей, форма ввода с кнопками. Пришлите свой макрос — объяснит ошибку Run-time, ускорит медленный цикл и добавит построчные комментарии, чтобы код можно было править самому.
Работает онлайнРусский и другие языкиТест бесплатно, без регистрацииБез VPNДоступ 24/7Голосовой ввод и файлы
Зарегистрируйтесь и подтвердите почту — начислим ещё 30 000 символов на 30 дней.ЗарегистрироватьсяОнлайн
Программистам · ИИ-инструмент нейросети Аливия
Конструктор макросов VBA
Опишите задачу и устройство файла — бот напишет макрос с комментариями и скажет, как его запустить.
Ещё настройки
Запрос подставится в поле чата — его можно поправить перед отправкой.
Вот макрос VBA для выполнения вашей задачи:
Option Explicit
Sub СобратьДанные()
' Объявление переменных
Dim папка As String ' Папка выбора файлов
Dim файл As String ' Имя файла
Dim wb As Workbook ' Открываемая книга
Dim wsИсточника As Worksheet ' Лист "Заказы" в открываемой книге
Dim wsЦель As Worksheet ' Лист для сбора данных
Dim последняяСтрокаЦель As Long ' Последняя строка для вставки данных
Dim ред As Long ' Счетчик строк данных
Dim заголовкиСобраны As Boolean ' Флаг для заголовков
On Error GoTo Ошибка ' Обработка ошибок
' Отключаем обновление экрана и автопересчет
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Выбираем папку с файлами
папка = Application.FileDialog(msoFileDialogFolderPicker).Show
If папка = "" Then Exit Sub ' Если папка не выбрана, выходим
' Создаем новый лист для сбора данных
Set wsЦель = ThisWorkbook.Worksheets.Add
wsЦель.Name = "СобранныеДанные"
' Инициализация флага заголовков
заголовкиСобраны = False
' Получаем имена всех файлов в папке
файл = Dir(папка & "\*.xlsx")
Do While файл <> ""
' Открываем каждую книгу
Set wb = Workbooks.Open(папка & "\" & файл)
' Проверяем, существует ли лист "Заказы"
On Error Resume Next
Set wsИсточника = wb.Worksheets("Заказы")
On Error GoTo Ошибка
If Not wsИсточника Is Nothing Then
' Находим последнюю строку с данными на целевом листе
последняяСтрокаЦель = wsЦель.Cells(wsЦель.Rows.Count, 1).End(xlUp).Row
' Если заголовки еще не собраны, копируем их
If Not заголовкиСобраны Then
wsИсточника.Rows(1).Copy Destination:=wsЦель.Rows(1)
заголовкиСобраны = True
End If
' Находим последнюю строку с данными на листе источника
ред = wsИсточника.Cells(wsИсточника.Rows.Count, 1).End(xlUp).Row
' Копируем данные со второго ряда до последней строки
wsИсточника.Rows("2:" & ред).Copy Destination:=wsЦель.Rows(последняяСтрокаЦель + 1)
' Записываем имя файла в последний столбец
wsЦель.Range(wsЦель.Cells(последняяСтрокаЦель + 2, 4), wsЦель.Cells(последняяСтрокаЦель + ред - 1, 4)).Value = файл
End If
' Закрываем книгу источника
wb.Close SaveChanges:=False
файл = Dir ' Получаем следующий файл
Loop
MsgBox "Данные собраны успешно!", vbInformation
Выйти:
' Возвращаем настройки
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Exit Sub
Ошибка:
MsgBox "Произошла ошибка: " & Err.Description, vbCritical
Resume Выйти
End SubКак вставить и запустить макрос
- Вставка макроса:
- Откройте Excel.
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В редакторе нажмите
Insert>Module, чтобы создать новый модуль. - Скопируйте и вставьте код макроса в открывшееся окно модуля.
- Добавление кнопки:
- Вернитесь в Excel.
- Перейдите на вкладку
Разработчик(если не видите, активируйте её в параметрах). - Нажмите
Вставитьи выберитеКнопка (элемент управления формы). - Нарисуйте кнопку на листе.
- В появившемся окне выберите созданный макрос
СобратьДанныеи нажмитеОК.
- Сохранение файла:
- Сохраните файл в формате
Excel Macro-Enabled Workbook (*.xlsm)для того, чтобы макрос работал.
- Сохраните файл в формате
Теперь, нажав на кнопку, вы сможете запустить макрос для сбора данных с листа "Заказы" из всех .xlsx файлов в выбранной папке.
Вот исправленный код вашего макроса с учётом всех ваших требований:
Option Explicit
' Константы для замены
Const ЛистОтчёт As String = "Отчет" ' Название листа
Const СтолбецСуммы As String = "B" ' Столбец для суммы
Sub Отчёт()
Dim ws As Worksheet
Dim ИтоговаяСумма As Double
On Error GoTo Ошибка ' Обработка ошибок
' Отключаем обновление экрана и автопересчёт
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Устанавливаем ссылку на лист
Set ws = Sheets(ЛистОтчёт)
' Подписываем итог
ws.Range("A1").Value = "Итого"
' Считаем сумму в указанном столбце
ИтоговаяСумма = Application.WorksheetFunction.Sum(ws.Range(СтолбецСуммы & "2:" & СтолбецСуммы & "100"))
ws.Range(СтолбецСуммы & "1").Formula = ИтоговаяСумма
' Включаем обратно обновление экрана и автопересчёт
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
Exit Sub ' Завершение работы макроса
Ошибка:
MsgBox "Ошибка: " & Err.Description, vbExclamation, "Ошибка выполнения"
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
End SubКуда вставить:
- Откройте Excel.
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - В редакторе выберите
Insert->Module, чтобы создать новый модуль. - Вставьте код в открывшееся окно модуля.
Как запустить:
- Закройте редактор VBA.
- В Excel нажмите
Alt + F8. - Выберите
Отчёти нажмитеRun.
В каком формате сохранить файл с макросом:
Сохраните файл в формате Excel Macro-Enabled Workbook (*.xlsm), чтобы макросы работали.
Теперь код обрабатывает ошибку, отключает обновление экрана и автопересчёт, и корректно рассчитывает сумму. Если возникнет ошибка, вы получите сообщение с описанием проблемы.
Давай разберём твой макрос VBA для Outlook по блокам:
1. Объявление переменных
Dim itm As Object, att As Attachment
Здесь объявляются две переменные: itm для хранения каждого выделенного элемента (например, письма) и att для хранения вложений в этих письмах.
2. Цикл по выделенным элементам
For Each itm In Application.ActiveExplorer.Selection
Этот цикл проходит по всем элементам, которые в данный момент выделены пользователем в Outlook.
3. Проверка типа элемента
If itm.Class = olMail Then
Здесь проверяется, является ли текущий элемент (письмо) классом olMail (т.е. является ли это электронным письмом).
4. Цикл по вложениям
For Each att In itm.Attachments
Если элемент — это письмо, то следующий цикл проходит по всем вложениям в этом письме.
5. Сохранение вложений
att.SaveAsFile "C:\Счета\" & att.FileName
Каждое вложение сохраняется в папку "C:\Счета\" с использованием оригинального имени файла вложения.
Итоговые действия после запуска макроса:
- Сохраняются все вложения из выделенных писем в указанную папку на диске (C:\Счета\).
- Если в этой папке уже есть файлы с такими же именами, они будут перезаписаны (т.е. старые файлы будут удалены и заменены новыми).
Опасности:
- Удаление данных: Файлы с теми же именами, которые уже существуют в папке "C:\Счета\", будут удалены (перезаписаны).
- Перезапись файлов: Как упомянуто выше, существующие файлы с такими же именами будут перезаписаны.
- Отправка писем: В этом коде нет отправки писем, только сохранение вложений.
Если у тебя есть дополнительные вопросы или нужна помощь с другими аспектами, дай знать!
Option Explicit
' Константы для замены
Const SHEET_NAME As String = "Выгрузка" ' Имя листа
Const COLUMN_SUM As Long = 3 ' Столбец C
Const COLUMN_MARK As Long = 5 ' Столбец E
Const THRESHOLD As Double = 100000 ' Пороговое значение
Sub Пометить()
Dim ws As Worksheet ' Объявляем переменную для листа
Dim lastRow As Long ' Переменная для определения последней строки
Dim i As Long ' Счетчик для цикла
' Устанавливаем ссылку на лист
Set ws = ThisWorkbook.Sheets(SHEET_NAME)
' Определяем последнюю строку в столбце C
lastRow = ws.Cells(ws.Rows.Count, COLUMN_SUM).End(xlUp).Row
' Обходим строки от 2 до последней
For i = 2 To lastRow
' Проверяем, если сумма заказа больше порогового значения
If ws.Cells(i, COLUMN_SUM).Value > THRESHOLD Then
' Помечаем заказ как "крупный"
ws.Cells(i, COLUMN_MARK).Value = "крупный"
' Подсвечиваем ячейку желтым
ws.Cells(i, COLUMN_MARK).Interior.Color = vbYellow
End If
Next i
End SubОбъяснение изменений:
- Использование переменной
ws: Вместо обращения к ячейкам черезCells, добавление ссылки на лист через переменнуюwsускоряет доступ к ячейкам, что значительно улучшает производительность. - Определение последней строки: Использование
ws.Cells(ws.Rows.Count, COLUMN_SUM).End(xlUp).Rowпозволяет избежать фиксированного количества строк (50000) и делать код динамичным, обрабатывая только заполненные строки. - Убраны
SelectиActivate: Эти методы замедляют выполнение кода, поэтому мы обращаемся к ячейкам напрямую, что также улучшает производительность. - Комментарии: Добавлены комментарии к коду для лучшего понимания каждого шага.
- Объявление переменных: Все переменные объявлены с явными типами, что улучшает читаемость и предотвращает ошибки.
Вот код макроса VBA для Word, который выполняет заданные задачи:
Option Explicit
' Константы для замены
Const FIND_DOUBLE_SPACES As String = " "
Const REPLACE_DOUBLE_SPACES As String = " "
Const FIND_QUOTE As String = """"
Const REPLACE_QUOTE_OPEN As String = "«"
Const REPLACE_QUOTE_CLOSE As String = "»"
Sub ReplaceTextInDocument()
Dim originalFilePath As String
Dim copyFilePath As String
Dim replacementsCount As Long
On Error GoTo ErrorHandler ' Обработка ошибок
Application.ScreenUpdating = False ' Отключаем обновление экрана
' Сохраняем копию файла
originalFilePath = ActiveDocument.FullName
copyFilePath = Left(originalFilePath, InStrRev(originalFilePath, ".")) & "bak"
ActiveDocument.SaveCopyAs copyFilePath
' Замена двойных пробелов на одинарные
With ActiveDocument.Content.Find
.Text = FIND_DOUBLE_SPACES
.Replacement.Text = REPLACE_DOUBLE_SPACES
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
replacementsCount = replacementsCount + .Found ' Считаем количество замен
End With
' Замена прямых кавычек на «ёлочки»
With ActiveDocument.Content.Find
.Text = FIND_QUOTE
.Replacement.Text = REPLACE_QUOTE_OPEN ' Открывающая кавычка
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
End With
' Замена прямых кавычек на закрывающую «ёлочку»
With ActiveDocument.Content.Find
.Text = FIND_QUOTE
.Replacement.Text = REPLACE_QUOTE_CLOSE ' Закрывающая кавычка
.Wrap = wdFindContinue
.Execute Replace:=wdReplaceAll
replacementsCount = replacementsCount + .Found ' Считаем количество замен
End With
' Вывод сообщения о количестве замен
MsgBox "Количество замен: " & replacementsCount, vbInformation, "Результат"
Exit Sub
ErrorHandler: ' Обработка ошибок
MsgBox "Произошла ошибка: " & Err.Description, vbCritical, "Ошибка"
Finally:
Application.ScreenUpdating = True ' Включаем обновление экрана
End SubКуда вставить:
- Откройте Word.
- Нажмите
Alt + F11, чтобы открыть редактор VBA. - Вставьте код в обычный модуль (Insert > Module).
Как запустить:
- Нажмите
Alt + F8в Word. - Выберите
ReplaceTextInDocumentи нажмитеRun.
В каком формате сохранить файл с макросом:
Сохраните документ в формате Word Macro-Enabled Document (*.docm).
Вот макрос VBA, который выполнит описанную вами задачу:
Option Explicit
' Константы для замены
Const SHEET_NAME As String = "Заказы" ' Название листа
Const STATUS_COLUMN As Long = 4 ' Столбец D (статус)
Const DATE_COLUMN As Long = 5 ' Столбец E (дата оплаты)
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo ErrorHandler ' Обработка ошибок
' Проверяем, попадает ли изменённый диапазон в нужный столбец D
If Not Intersect(Target, Me.Columns(STATUS_COLUMN)) Is Nothing Then
Dim Cell As Range ' Объявляем переменную для цикла
' Проходим по всем изменённым ячейкам
For Each Cell In Target
' Проверяем, является ли ячейка в том же ряду, что и изменённая
If Not IsEmpty(Cell) Then
' Если статус "Оплачен", записываем текущую дату и время
If Cell.Value = "Оплачен" Then
Me.Cells(Cell.Row, DATE_COLUMN).Value = Now
Else
' Если статус стерли, очищаем дату оплаты
Me.Cells(Cell.Row, DATE_COLUMN).ClearContents
End If
Else
' Если ячейка пустая, очищаем дату оплаты
Me.Cells(Cell.Row, DATE_COLUMN).ClearContents
End If
Next Cell
End If
Exit Sub ' Уходим из процедуры
ErrorHandler:
MsgBox "Произошла ошибка: " & Err.Description, vbExclamation, "Ошибка" ' Выводим сообщение об ошибке
End SubКуда вставить:
- Откройте Excel на Mac.
- Нажмите
Option + F11, чтобы открыть редактор VBA. - Найдите свой лист «Заказы» в проекте VBA (например,
VBAProject (Имя_вашего_файла)). - Дважды щелкните на листе «Заказы», чтобы открыть окно кода.
- Вставьте код в окно.
Как запустить:
- Код будет выполняться автоматически при изменении ячеек в столбце D (статус).
- Просто измените статус в столбце D на «Оплачен» или удалите его.
В каком формате сохранить файл:
Сохраните файл в формате Excel с поддержкой макросов: *.xlsm. Для этого выберите "Файл" -> "Сохранить как" и выберите формат "Excel с поддержкой макросов".
Ответы получены 28.09.2026 в этом чате и приведены без правок. Выделено то, чего не было в запросе.
Что автоматизируют на VBA чаще всего
Макрос окупается там, где действие повторяется каждый день или каждую неделю.
| Задача | Что просить у инструмента |
|---|---|
| Свести данные из нескольких файлов | «Собери листы из всех книг в папке в одну таблицу» |
| Привести выгрузку в порядок | «Убери пустые строки, приведи даты к одному формату» |
| Сформировать документы по шаблону | «Сделай письма по списку получателей в Word» |
| Регулярный отчёт | «Построй сводную и выгрузи в PDF по кнопке» |
| Проверка данных | «Подсвети строки, где значения не сходятся» |
Макрос меняет файл без возможности отменить действие: кнопка «Отменить» после выполнения не работает. Прогоняйте новый код на копии книги, а не на единственном экземпляре отчёта.
Макросы для Excel
Самая частая задача — обработка таблиц: фильтрация и перенос строк по условию, сведение данных с нескольких листов, удаление дублей, расстановка формул, форматирование по правилам, построение диаграмм. Аливия возвращает готовую процедуру Sub с комментариями и подсказывает, куда её вставить: в модуль книги, листа или личную книгу макросов.
Работа с файлами и папками
ИИ пишет код для обхода каталогов, открытия книг в цикле, сохранения копий с датой в имени, экспорта листов в отдельные файлы и в PDF. Отдельная задача — сбор данных из десятков однотипных отчётов в одну таблицу: вручную это часы, макросом — минуты.
Формы и пользовательский интерфейс
UserForm с полями ввода, выпадающими списками, проверкой заполнения и записью в таблицу — типичный запрос от тех, кто делает мини-приложение внутри книги. Аливия сгенерирует и разметку формы, и обработчики событий кнопок, и валидацию значений.
Word, Outlook, Access и PowerPoint
VBA работает во всём пакете Office. Через чат можно получить макрос для сборки договора по шаблону в Word, для рассылки писем с вложениями в Outlook, для запросов к таблицам Access или для генерации презентации из данных Excel.
Отладка и ускорение
Вставьте текст ошибки и фрагмент кода — ИИ покажет строку, где всё ломается, объяснит причину и предложит исправление. Отдельно можно попросить оптимизацию: перевод на массивы, отключение перерисовки экрана, устранение лишних обращений к листу.
Бухгалтерам и финансистам
Сверка выгрузок, разнесение проводок, ежемесячные отчёты по одному шаблону — всё, что повторяется из месяца в месяц, превращается в одну кнопку.
Аналитикам и менеджерам
Сбор данных из разных источников, чистка дублей, автоматическая сборка сводных таблиц и графиков к совещанию.
Тем, кто только осваивает VBA
Генератор работает и как учебник: код возвращается с комментариями, а на любой непонятный фрагмент можно попросить объяснение простыми словами. Рядом пригодятся генератор таблиц и генератор кода на Python, если задача перерастёт возможности Office.
Ограничения, о которых честно стоит знать
Нейросеть не видит ваш файл: она пишет код по описанию, поэтому имена листов, столбцов и диапазонов нужно указывать точно. Сложные проекты с десятками модулей лучше разбирать по частям. И главное — любой макрос, который удаляет или перезаписывает данные, сначала запускайте на копии книги: отменить выполнение макроса через Ctrl+Z нельзя.
Особенности VBA, о которых стоит помнить
VBA живёт внутри офисных приложений, и его ограничения задаёт не язык, а среда. Это влияет и на код, и на то, как его запускать.
- Файл с макросами. Книга должна быть сохранена как
.xlsm— в обычном.xlsxмакросы не сохраняются. - Безопасность макросов. По умолчанию выполнение отключено; файл из интернета Excel открывает в защищённом режиме, и его нужно разблокировать в свойствах.
- Ссылки на библиотеки. Для работы с Word, Outlook или регулярными выражениями нужно подключить библиотеку через Tools → References или использовать позднее связывание.
- Скорость. Обращение к ячейкам поштучно медленно: выгружайте диапазон в массив, считайте в памяти и записывайте обратно одним действием.
- Отмена действий. После макроса стек отмены очищается — предупреждайте пользователей и делайте копию листа перед изменениями.
Готовая формула запроса: «Excel 2019, VBA. Нужен макрос: на листе «Данные» пройти строки со 2-й до последней заполненной, собрать значения столбцов A, C и F, записать сводку на лист «Отчёт». Используй массивы вместо поячеечного доступа, добавь Option Explicit, обработку ошибок и отключение обновления экрана».
Как описать задачу, чтобы макрос заработал с первого раза?
- Опишите структуру листа. Какие столбцы, с какой строки начинаются данные, есть ли заголовки и объединённые ячейки.
- Приложите пример строки. Форматы дат и чисел в Excel — источник половины ошибок.
- Скажите, что делать с исключениями. Пустые ячейки, текст вместо числа, дубликаты.
- Назовите версию Excel. Часть функций и методов различается между версиями и между Windows и macOS.
- Просите комментарии. Макрос переживёт вас в компании: понятные комментарии сэкономят время следующему.
Перед первым запуском макроса всегда делайте копию файла. Восстановить данные после неудачной записи в лист нельзя: обычная отмена в Excel после выполнения макроса не работает.
Что автоматизируют в Excel чаще всего
Типовые сценарии, которые окупают время на макрос за первую же неделю:
- Сборка отчёта из нескольких листов или файлов. Однообразная работа, которая занимает часы вручную.
- Приведение выгрузки к нужному виду. Удаление лишних столбцов, переименование заголовков, форматы дат и чисел.
- Поиск расхождений. Сверка двух таблиц по ключу с подсветкой отличий.
- Массовое создание документов. Печатные формы по шаблону для каждой строки таблицы.
- Рассылка писем. Формирование писем из таблицы через Outlook.
Прежде чем писать макрос, проверьте, не решается ли задача формулами или Power Query: их проще поддерживать, и они не требуют разрешения на выполнение макросов.
Как отлаживать макрос VBA?
Редактор VBA даёт полноценную отладку — этим стоит пользоваться, а не искать ошибку глазами.
- Пошаговое выполнение. Клавиша F8 выполняет код по строке — видно, где значение стало не тем.
- Окно Immediate.
Debug.Printвыводит промежуточные значения без всплывающих окон. - Точки останова. Ставьте их перед подозрительным участком, а не в начале процедуры.
- Option Explicit. Обязательная строка в начале модуля: она ловит опечатки в именах переменных.
- Обработка ошибок.
On Error GoToс понятным сообщением вместо молчаливого сбоя.
Готовая формула запроса: «Макрос падает на строке с циклом по диапазону, ошибка 1004. Вот код. Объясни причину, предложи исправление и добавь обработку ошибок с понятным сообщением для пользователя».
Когда макрос лучше заменить формулами
- Разовая задача. Если операция нужна один раз, формулы и Power Query быстрее.
- Файл уходит наружу. У получателя макросы могут быть отключены политикой безопасности.
- Данные обновляются регулярно. Power Query перестраивает отчёт по кнопке без кода.
- Задача — расчёт, а не действие. Формулы нагляднее и не требуют доверия к макросу.
- Некому поддерживать. Макрос без автора в компании живёт ровно до первой ошибки.
Прежде чем писать код, спросите прямо: «решается ли эта задача формулами или Power Query» — иногда ответ экономит целый день.
Цифры и факты
Что учесть при работе с макросами.
- Microsoft по умолчанию блокирует макросы VBA в файлах, полученных из интернета, — файл нужно разблокировать в свойствах или хранить в доверенном расположении.
- Код для Excel, Word и Access различается объектной моделью: приложение и версию Office стоит называть в запросе.
- В VBA нет автоматической отмены действий: макрос, изменяющий данные, лучше сначала запускать на копии файла.
- Списывается только ответ нейросети: ваш код и описание таблицы не тарифицируются.
Кейсы
Задачи, ради которых чаще всего открывают генератор макросов.
Запрос: «Напиши макрос, который строит сводную по выгрузке на отдельном листе: продажи по менеджерам и месяцам»

Sub BuildPivot()
Dim wsData As Worksheet, wsPivot As Worksheet
Dim cache As PivotCache, pivot As PivotTable
Dim lastRow As Long, lastCol As Long
Set wsData = ThisWorkbook.Worksheets("Данные")
' Границы ищем от последней ячейки вверх: End(xlDown) остановится
' на первой же пустой строке внутри таблицы
lastRow = wsData.Cells(wsData.Rows.Count, 1).End(xlUp).Row
lastCol = wsData.Cells(1, wsData.Columns.Count).End(xlToLeft).Column
If lastRow < 2 Then
MsgBox "На листе «Данные» нет строк.", vbExclamation
Exit Sub
End If
' Старый лист удаляем без вопроса пользователю
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets("Сводная").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set wsPivot = ThisWorkbook.Worksheets.Add(After:=wsData)
wsPivot.Name = "Сводная"
Set cache = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
SourceData:=wsData.Range(wsData.Cells(1, 1), wsData.Cells(lastRow, lastCol)))
Set pivot = cache.CreatePivotTable(TableDestination:=wsPivot.Range("A3"), _
TableName:="СводнаяПродажи")
With pivot
.PivotFields("Менеджер").Orientation = xlRowField
.PivotFields("Дата").Orientation = xlColumnField
.AddDataField .PivotFields("Сумма"), "Выручка", xlSum
.PivotFields("Выручка").NumberFormat = "# ##0 ₽"
.RowAxisLayout xlTabularRow
End With
' Группировка дат по месяцам и годам
On Error Resume Next
wsPivot.Range("B3").Group Start:=True, End:=True, Periods:= _
Array(False, False, False, False, True, False, True)
On Error GoTo 0
wsPivot.Columns.AutoFit
wsPivot.Activate
MsgBox "Сводная построена: строк в источнике " & lastRow - 1, vbInformation
End SubЗапрос: «Нужно перенести на лист «Архив» все строки, где в колонке «Статус» стоит «Закрыт», и удалить их из исходного»

Sub MoveClosedRows()
Dim wsSource As Worksheet, wsTarget As Worksheet
Dim lastRow As Long, targetRow As Long, i As Long
Dim moved As Long
Dim statusCol As Long
Dim data As Variant
Dim keep As Collection
Set wsSource = ThisWorkbook.Worksheets("Заявки")
Set wsTarget = ThisWorkbook.Worksheets("Архив")
statusCol = Application.Match("Статус", wsSource.Rows(1), 0)
If IsError(statusCol) Then
MsgBox "Не нашёл колонку «Статус».", vbExclamation
Exit Sub
End If
lastRow = wsSource.Cells(wsSource.Rows.Count, 1).End(xlUp).Row
targetRow = wsTarget.Cells(wsTarget.Rows.Count, 1).End(xlUp).Row + 1
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
' Идём СНИЗУ ВВЕРХ: при удалении сверху строки смещаются
' и цикл по возрастанию пропускает каждую вторую подходящую
For i = lastRow To 2 Step -1
If StrComp(Trim(CStr(wsSource.Cells(i, statusCol).Value)), "Закрыт", vbTextCompare) = 0 Then
wsSource.Rows(i).Copy
wsTarget.Rows(targetRow).PasteSpecial xlPasteAll ' с форматом
Application.CutCopyMode = False
wsSource.Rows(i).Delete
targetRow = targetRow + 1
moved = moved + 1
End If
Next i
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "Перенесено строк: " & moved, vbInformation
End SubЗапрос: «Вот мой макрос, он обрабатывает 20 000 строк и Excel зависает. Перепиши, чтобы работал быстро»

' ─── БЫЛО: обращение к листу на каждую ячейку ───
' For i = 2 To 20000
' Cells(i, 1).Select ' Select — самый дорогой вызов в VBA
' If Cells(i, 3).Value > 1000 Then
' Cells(i, 5).Value = Cells(i, 3).Value * 0.9
' End If
' Next i
' ─── СТАЛО: один обмен с листом на вход и один на выход ───
Sub ApplyDiscount()
Dim ws As Worksheet
Dim data As Variant, result As Variant
Dim lastRow As Long, i As Long
Dim calcMode As XlCalculation
Set ws = ThisWorkbook.Worksheets("Продажи")
lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row
If lastRow < 2 Then Exit Sub
' Состояние Excel запоминаем, чтобы вернуть даже при ошибке
calcMode = Application.Calculation
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
On Error GoTo Finally
' Весь диапазон заезжает в массив одним действием
data = ws.Range("C2:C" & lastRow).Value
ReDim result(1 To UBound(data, 1), 1 To 1)
For i = 1 To UBound(data, 1)
If IsNumeric(data(i, 1)) Then
If data(i, 1) > 1000 Then
result(i, 1) = data(i, 1) * 0.9
Else
result(i, 1) = data(i, 1)
End If
End If
Next i
' И выгружается обратно тоже одним
ws.Range("E2:E" & lastRow).Value = result
Finally:
Application.EnableEvents = True
Application.Calculation = calcMode
Application.ScreenUpdating = True
If Err.Number <> 0 Then
MsgBox "Ошибка " & Err.Number & ": " & Err.Description, vbCritical
End If
End Sub
' Что дало ускорение:
' 1. Массив вместо обращения к ячейкам — каждое стоит около 0,1 мс,
' на 20 000 строк это минуты.
' 2. Отключённые пересчёт, отрисовка и события.
' 3. Ни одного Select и Activate: они вообще не нужны для работы с данными.Запрос: «Нужен макрос для Word: заменить в документе термины по таблице соответствий из Excel и выделить замены цветом»

Sub ReplaceTerms()
Dim doc As Document
Dim excel As Object, book As Object, sheet As Object
Dim lastRow As Long, i As Long
Dim replaced As Long
Dim findText As String, newText As String
Set doc = ActiveDocument
' Позднее связывание: не нужно подключать библиотеку Excel в References
Set excel = CreateObject("Excel.Application")
excel.Visible = False
On Error GoTo Finally
Set book = excel.Workbooks.Open("C:\Docs\terms.xlsx", ReadOnly:=True)
Set sheet = book.Worksheets(1)
lastRow = sheet.Cells(sheet.Rows.Count, 1).End(-4162).Row ' xlUp
For i = 2 To lastRow
findText = Trim(CStr(sheet.Cells(i, 1).Value))
newText = Trim(CStr(sheet.Cells(i, 2).Value))
If Len(findText) = 0 Then GoTo NextRow
With doc.Content.Find
.ClearFormatting
.Replacement.ClearFormatting
.Replacement.Highlight = True ' подсветим, что заменили
.Text = findText
.Replacement.Text = newText
.Forward = True
.Wrap = wdFindContinue
.MatchCase = False
.MatchWholeWord = True ' «код» не тронет «кодекс»
.MatchWildcards = False
If .Execute(Replace:=wdReplaceAll) Then
replaced = replaced + 1
End If
End With
NextRow:
Next i
Finally:
If Err.Number <> 0 Then MsgBox "Ошибка: " & Err.Description, vbCritical
If Not book Is Nothing Then book.Close SaveChanges:=False
If Not excel Is Nothing Then excel.Quit ' иначе Excel останется в памяти
Set sheet = Nothing: Set book = Nothing: Set excel = Nothing
MsgBox "Терминов заменено: " & replaced, vbInformation
End SubЗапрос: «В коде было Range("Город"), а стало Range("Ãîðîä"). Файл открывается, но макрос не находит диапазон»

' Причина: файл с макросом или импортируемый CSV читается не в той кодировке.
' Редактор VBA хранит строки в кодировке системы, и текст, набранный
' в UTF-8, при импорте .bas превращается в «Ãîðîä».
'
' Лечится не переписыванием букв, а тремя приёмами:
' ─── 1. Не хранить русский текст в коде, брать его с листа ───
Sub UseNamedRange()
Dim cityRange As Range
Set cityRange = ThisWorkbook.Names("Город").RefersToRange
' Имя диапазона живёт в книге в правильной кодировке
' и не страдает при переносе модуля между машинами
End Sub
' ─── 2. Правильно открывать CSV: указывать кодировку явно ───
Sub OpenUtf8Csv(ByVal path As String)
' 65001 — UTF-8. Без этого Workbooks.Open читает файл
' в системной кодировке и портит кириллицу
Workbooks.OpenText Filename:=path, _
Origin:=65001, _
DataType:=xlDelimited, _
Semicolon:=True, _
Local:=True ' даты и дробные по настройкам системы
End Sub
' ─── 3. Записывать текстовый файл в UTF-8 через ADODB ───
Sub SaveUtf8(ByVal path As String, ByVal content As String)
Dim stream As Object
Set stream = CreateObject("ADODB.Stream")
stream.Type = 2 ' текстовый поток
stream.Charset = "UTF-8"
stream.Open
stream.WriteText content
stream.SaveToFile path, 2 ' перезаписать
stream.Close
' Print # и Write # пишут в системной кодировке —
' в Блокноте и в Google Таблицах получится каша
End Sub
' Если модуль всё-таки пришёл битым: откройте .bas в редакторе
' с выбором кодировки (Notepad++, VS Code), переключите на Windows-1251,
' сохраните в UTF-8 — и импортируйте заново.Опрос
Создание кода VBA: частые вопросы
Нужно ли знать VBA, чтобы пользоваться генератором?
В какой версии Excel заработает сгенерированный код?
Аливия умеет работать не только с Excel?
Почему макрос выдаёт ошибку 1004 или 424?
Можно ли ускорить медленный макрос?
Безопасно ли запускать сгенерированные макросы?
Чем VBA лучше Python для автоматизации Office?
Как написать макрос, который обрабатывает все файлы в папке?
Как сделать пользовательскую форму (UserForm) для ввода данных?
Как отладить макрос, который работает неправильно?
Итог
Генератор кода VBA собирает макросы под вашу структуру листа: с обработкой ошибок, комментариями и приёмами, которые не роняют скорость на больших таблицах. Опишите лист и приложите пример строки — и рабочий код придёт с первого ответа. Попробуйте бесплатно; при регулярной автоматизации посмотрите тарифы. Рядом: генератор таблиц, Python, SQL.