Программирование и ИИ

VBA в Excel: как написать код, который сам заполняет и оформляет лист

VBA в Excel — это Visual Basic для приложений: язык для тех, кому записанного макроса мало и нужны условия, повторы и любой диапазон. Код пишут в редакторе Visual Basic, который открывается клавишами ALT+F11[1]. Процедура Sub выполняет строки сверху вниз, а листы и ячейки получают значения по имени. Ниже — первый код, переменные, условия и границы инструмента.

Тренажёр: 7 шагов

Записанный макрос оформил шапку, но завтра в таблице на десять строк больше, и половина отчёта осталась без формата. Справка 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 сохранит данные, а код пропадёт вместе с модулями.

Миф: обычная книга XLSX сохранит код VBA — на деле справка Microsoft о форматах файлов прямо запрещает хранить в XLSX код макросов VBA[8].
Миф: VBA работает в любой версии Excel, включая браузер, — на деле английская справка Microsoft отмечает, что в Excel в Интернете и Excel для iOS макросы VBA не поддерживаются[4].
Не путать: запись действий, вкладка «Разработчик» и личная книга — тема записи; подробнее — на странице о записи и запуске макросов для начинающих.

Разобравшись с тем, что такое язык, переходим к рабочему месту — редактору.

Как открыть редактор Visual Basic и создать модуль

Код VBA пишут в стандартном модуле, который создаёт команда Insert → Module редактора[3]. Порядок для первой процедуры:

  1. Нажмите ALT+F11 — откроется редактор Visual Basic[1].
  2. В меню Insert выберите Module: справка описывает команду как вставку нового стандартного модуля в активный проект[3].
  3. Наберите процедуру вручную или выберите Insert → Procedure — так в модуль вставляется Sub, Function или Property[3].
  4. Запустите код клавишей F5, а пошагово — клавишей F8[2].
  5. Сохраните книгу в формате 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, считает значение и пишет его в диапазон листа. Возьмём лист с ценой и количеством:

ABC
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].

Миф: объявлять переменные в VBA не нужно, это ничего не меняет — на деле справка Microsoft описывает ошибку компиляции при Option Explicit и тип Variant без неё[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 видят только книгу.

Не путать: формы ввода, массивы и сложные циклы — следующий уровень; подробнее — на странице о UserForm, циклах и массивах в VBA.

Остаётся понять, когда код 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]. Для браузера есть отдельный инструмент сценариев.

Почему код не запускается после открытия файла?

Макрос не запускается, если файл сохранён в XLSX — этот формат не хранит макросы[8] — или если файл из интернета заблокирован меткой Mark of the Web[7]. Проверьте формат и снимите флажок блокировки в свойствах файла.

Источники

  1. [1] Microsoft, справка «Автоматизация задач с помощью средства записи макросов — Excel», 2026
  2. [2] Microsoft, справка «Запуск макроса в Excel», 2026
  3. [3] Microsoft, справка «Insert menu» (английская версия), 2026
  4. [4] Microsoft, справка «Differences between Office Scripts and VBA macros» (английская версия), 2026
  5. [5] Microsoft, справка «Option Explicit statement (VBA)» (английская версия), 2026
  6. [6] Google, справка «Automate tasks in Google Sheets» (английская версия), 2026
  7. [7] Microsoft, справка «Macros from the internet are blocked by default in Office» (английская версия), 2026
  8. [8] Microsoft, справка «Поддерживаемые Excel форматы файлов», 2026
  9. [9] Microsoft, справка «Range.Value property (Excel)» (английская версия), 2026
  10. [10] Microsoft, справка «Font.Bold property (Excel)» (английская версия), 2026

Похожие темы