Программирование и ИИ
VBA в Excel: как написать код, который сам заполняет и оформляет лист
VBA в Excel — это Visual Basic для приложений: язык для тех, кому записанного макроса мало и нужны условия, повторы и любой диапазон. Код пишут в редакторе Visual Basic, который открывается клавишами ALT+F11[1]. Процедура Sub выполняет строки сверху вниз, а листы и ячейки получают значения по имени. Ниже — первый код, переменные, условия и границы инструмента.
Записанный макрос оформил шапку, но завтра в таблице на десять строк больше, и половина отчёта осталась без формата. Справка Microsoft объясняет почему: макрос, записанный для диапазона, выполняется только для ячеек этого диапазона[1]. Чтобы процедура сама находила нужные ячейки и проверяла условия, код дописывают вручную.
Путь к первому коду такой. Сначала поймите задачу — чего не умеет запись: условий, повторов, подсчёта строк. Затем выберите инструмент: код VBA в стандартном модуле. Освойте основы — редактор, модуль, процедуру Sub, переменные и объект Range, — попробуйте написать процедуру в тренажёре и примените её к своей книге. Главный риск — запустить чужой код вслепую: справка советует запускать макросы только из файлов, которым вы доверяете[2].
Ключевые факты: VBA в Excel
- VBA — Visual Basic для приложений, язык, в котором Excel сохраняет записанные шаги макроса[1].
- Команда Insert → Module вставляет новый стандартный модуль в активный проект[3].
- Макросы VBA не поддерживаются в Excel в Интернете и Excel для iOS[4].
- Модуль с Option Explicit отличается от модуля без неё тем, что необъявленная переменная даёт ошибку компиляции, а не тип Variant[5].
- Запускать чужие процедуры справка Microsoft разрешает только из файлов, которым вы доверяете[2].
Что такое VBA в Excel и где писать код
VBA — это язык, на котором записан любой макрос Excel и который можно писать вручную. Справка Microsoft о записи макросов прямо называет язык: записанные шаги сохраняются в коде Visual Basic для приложений[1]. Записанную процедуру можно открыть, прочитать и дописать. Запись с последующей правкой кода описана для Excel 2016 и Excel 2019, а для Excel 2021 и Excel 2024 — ещё и в версиях для Mac[1].
| Где запускается | VBA |
|---|---|
| Excel для Windows | да |
| Excel для Mac | да |
| Excel в Интернете | нет |
| Excel для iOS | нет |
| Power Automate | нет |
VBA в Excel встроен в настольные версии программы, и для кода не нужна отдельная лицензия[4]. Взамен процедуры живут только на компьютере: в браузерной версии и на iPhone они не выполнятся[4].
В Google Таблицах VBA нет: справка Google пишет, что записанный там макрос создаёт Apps Script[6]. Перенести процедуру из Excel в Таблицы без переписывания не получится.
Английская справка предупреждает, что макросы VBA получают тот же уровень доступа, что и Excel, — полный доступ к компьютеру[4]. Поэтому код из чужого файла сначала читают в редакторе, а уже потом запускают. Код из интернета Windows дополнительно блокирует меткой Mark of the Web[7].
Книгу с процедурами сохраняют только в XLSM: формат XLSX не хранит код макросов VBA[8]. Книга XLSM сохраняет модули VBA вместе с листами макросов Excel 4.0[8]. Если по ошибке выбрать XLSX, Excel сохранит данные, а код пропадёт вместе с модулями.
Разобравшись с тем, что такое язык, переходим к рабочему месту — редактору.
Как открыть редактор Visual Basic и создать модуль
Код VBA пишут в стандартном модуле, который создаёт команда Insert → Module редактора[3]. Порядок для первой процедуры:
- Нажмите ALT+F11 — откроется редактор Visual Basic[1].
- В меню Insert выберите Module: справка описывает команду как вставку нового стандартного модуля в активный проект[3].
- Наберите процедуру вручную или выберите Insert → Procedure — так в модуль вставляется Sub, Function или Property[3].
- Запустите код клавишей F5, а пошагово — клавишей F8[2].
- Сохраните книгу в формате XLSM.
| Команда меню Insert | Что делает по справке |
|---|---|
| Module | вставляет стандартный модуль в проект |
| Procedure | вставляет процедуру Sub, Function или Property |
| Class Module | создаёт модуль класса |
| UserForm | создаёт форму |
Пошаговый режим F8 — главный инструмент новичка: строка, которая выполнится следующей, подсвечивается, и видно, где процедура делает не то. VBA в Excel не требует отдельной установки: редактор встроен в настольную программу, и первую процедуру можно написать в любой книге, сохранённой как XLSM[8]. Справка о записи макросов включает и Excel 2021 для Mac, и Excel 2024 для Mac[1], так что на Mac редактор тоже доступен. Если процедура должна срабатывать при открытии книги, её пишут не в модуле, а в Workbook_Open объекта ThisWorkbook[2].
Команда Insert → Procedure недоступна, если модуль не активен[3], поэтому сначала создайте модуль и щёлкните в его окне. Имена модулей и процедур делайте говорящими — через месяц FillTotals понятнее, чем Module1.
Однако открыть редактор — только начало: язык устроен иначе, чем формулы листа, и первая процедура показывает это лучше всего.
Первая процедура: Sub, Dim, Option Explicit и диапазон на примере
Процедура VBA объявляет переменную через Dim, считает значение и пишет его в диапазон листа. Возьмём лист с ценой и количеством:
| A | B | C | |
|---|---|---|---|
| 1 | Товар | Цена | Сумма |
| 2 | Лампа | 2400 | |
| 3 | Кресло | 15900 |
Option Explicit
Sub FillTotal()
Dim total As Double
total = Worksheets("Лист1").Range("B2").Value * 2
Worksheets("Лист1").Range("C2").Value = total
Worksheets("Лист1").Range("A1:C1").Font.Bold = True
End Sub
VBA в Excel читает такую процедуру сверху вниз. Разберём строки. Option Explicit должна стоять в модуле до любых процедур[5] и требует объявлять каждую переменную инструкциями Dim, Private, Public, ReDim или Static[5]. Dim объявляет переменную total, а свойство Value объекта Range возвращает или задаёт значение ячейки[9]. Последняя строка делает шапку жирной — так же, как в примере справки о свойстве Bold[10].
Без Option Explicit опечатка в имени переменной создаёт новую переменную типа Variant, и код молча считает неверно[5]. С инструкцией та же опечатка даёт ошибку ещё при компиляции[5].
Range.Value для диапазона из нескольких ячеек возвращает значения всех ячеек сразу, строками и столбцами[9] — это пригодится, когда данных станет много. Пока же достаточно читать и писать по одной ячейке: так процедуру проще проверить пошагово через F8[2].
Напишите первую процедуру в тренажёре: урок проверит, что значение попало в нужную ячейку, а переменная объявлена.
Именно поэтому следующий шаг — условия и повторы, которых в записи нет вовсе.
If и For Each: чем код отличается от записанного макроса
Код VBA проверяет условие и обходит ячейки по очереди, а запись повторяет шаги буквально. Справка о свойстве Value даёт образец такого цикла[9]:
For Each cell In Worksheets("Лист1").Range("A1:D10")
If cell.Value < 0.001 Then
cell.Value = 0
End If
Next cell
Цикл берёт каждую ячейку диапазона, и если значение меньше порога, заменяет его нулём. Запись так не умеет: она повторила бы действия только для тех ячеек, которые выделили при записи[1]. Порог и адрес диапазона легко поменять — достаточно поправить одну строку, а не перезаписывать действия заново.
| Признак | Запись макроса | Код с If и For Each |
|---|---|---|
| диапазон | только записанный | любой, в том числе вычисленный |
| условие | не записывается | If … Then … End If |
| повтор по ячейкам | нет | For Each … Next |
| ошибки при записи | попадают в код | правятся до запуска |
| знание языка | не нужно | нужно |
Комбинированный путь работает лучше всего: запишите шаги, откройте результат в редакторе Visual Basic и замените жёсткий адрес на цикл или условие. Если процедура меняет данные, отменить её действие нельзя: справка прямо пишет, что макросы нельзя отменить[1]. Запускайте новый код на копии книги и проверяйте пошагово через F8[2].
Код VBA отличается от Office Scripts тем, что может работать с COM и OLE на компьютере пользователя[4], а сценарии Office Scripts видят только книгу.
Остаётся понять, когда код VBA лучше не писать вовсе.
Когда VBA не подойдёт
VBA не подойдёт, если книгу открывают в браузере или запуск нужен по расписанию. Язык работает только в настольном Excel и только тогда, когда пользователь сам запускает макрос. Прежде чем писать строки, проверьте, где и кем будет открываться книга.
- Если книгу открывают в Excel в Интернете или на iPhone, код VBA там не выполнится[4] — нужны сценарии Office Scripts для браузерного Excel.
- Когда процедуру надо запускать по расписанию без открытия Excel, VBA не поможет: у него нет коннектора Power Automate[4].
- Если задача — регулярная чистка одной и той же выгрузки, проще записанные шаги запроса Power Query, чем код.
- При файле, который пришёл из интернета, Windows заблокирует код до снятия метки в свойствах файла[7].
- Если коллеги сохраняют книгу в XLSX, код пропадёт при первом же сохранении[8].
Коротко: VBA не подойдёт, если книгу открывают в Excel в Интернете или на iPhone, если запуск нужен по расписанию через Power Automate или если задача — регулярная чистка выгрузки. В настольном Excel для Windows и Mac[4] язык по-прежнему закрывает то, чего не умеют формулы и запись: условия, обход ячеек, работу с другими листами и книгами. Если коллеги работают в разных версиях, договоритесь о формате XLSM и о папке, из которой книги открываются без блокировки.
Начните с одной небольшой процедуры и запускайте её пошагово. Соседние темы собраны среди всех уроков тренажёра по программированию и ИИ.
Частые вопросы
Как открыть редактор VBA в Excel?
Редактор VBA в Excel открывается клавишами ALT+F11: справка о записи макросов называет это сочетание[1]. В редакторе добавьте модуль командой Insert → Module и пишите код в нём.
Что такое VBA простыми словами?
VBA — это язык Visual Basic для приложений, на котором записаны макросы Excel. Запись действий создаёт такие строки сама, а условия и повторы дописывают вручную[1].
Зачем нужен Option Explicit?
Option Explicit заставляет объявлять все переменные: без неё опечатка в имени создаёт новую переменную типа Variant[5]. Инструкцию ставят в начале модуля, до процедур.
Чем VBA отличается от макроса?
VBA отличается от макроса тем, что это язык, а макрос — готовая программа на нём. Записанный макрос повторяет шаги на одном диапазоне, а написанный вручную умеет проверять условия и обходить ячейки[1].
Работает ли VBA на Mac и в браузере?
VBA работает в Excel для Windows и Excel для Mac, но не в Excel в Интернете и не на iOS[4]. Для браузера есть отдельный инструмент сценариев.
Источники
- [1] Microsoft, справка «Автоматизация задач с помощью средства записи макросов — Excel», 2026
- [2] Microsoft, справка «Запуск макроса в Excel», 2026
- [3] Microsoft, справка «Insert menu» (английская версия), 2026
- [4] Microsoft, справка «Differences between Office Scripts and VBA macros» (английская версия), 2026
- [5] Microsoft, справка «Option Explicit statement (VBA)» (английская версия), 2026
- [6] Google, справка «Automate tasks in Google Sheets» (английская версия), 2026
- [7] Microsoft, справка «Macros from the internet are blocked by default in Office» (английская версия), 2026
- [8] Microsoft, справка «Поддерживаемые Excel форматы файлов», 2026
- [9] Microsoft, справка «Range.Value property (Excel)» (английская версия), 2026
- [10] Microsoft, справка «Font.Bold property (Excel)» (английская версия), 2026