VBA (Visual Basic for Applications) — встроенный язык программирования Microsoft Office. На нём пишут макросы для Excel, Word, Outlook, PowerPoint и Access: код сам заполняет таблицы, собирает отчёты и правит документы. Чтобы начать, включите вкладку «Разработчик», нажмите Alt+F11, вставьте модуль через Insert → Module и напишите первую процедуру Sub. Запускается она клавишей F5.
Если вам нужно только записать действия мышью и повторить их кнопкой, хватит инструкции про макросы в Excel. Здесь разберём сам язык: синтаксис, объекты Excel, отладку и то, как его учить.
Что такое VBA и где он работает

VBA вырос из языка Visual Basic, но живёт внутри приложений Office и управляет их объектами: книгами, листами, ячейками, письмами, слайдами. Отдельно от Office программа на VBA не запускается. Этим он отличается от VB.NET, который пишут в Visual Studio и собирают в самостоятельные приложения.
Microsoft в справке по началу работы с VBA даёт простой ориентир: если правку нужно внести больше десяти или двадцати раз, возможно, стоит автоматизировать её на VBA, а если несколько сотен раз, определённо стоит рассмотреть VBA.
| Приложение | Что обычно автоматизируют | Главный объект |
|---|---|---|
| Excel | чистку данных, сводки по листам, выгрузку отчётов | Workbook, Worksheet, Range |
| Word | оформление документов, замену по шаблону | Document, Paragraph |
| Outlook | рассылку писем, разбор входящих | MailItem |
| PowerPoint | сборку слайдов из данных Excel | Presentation, Slide |
| Access | формы и запросы к базе | Form, Recordset |
Важное ограничение: по таблице в справке Microsoft о сценариях Office макросы VBA работают в Excel для Windows и Excel для Mac, но не работают в Excel в браузере и в Excel для iOS. Если вы открываете файлы через Excel онлайн, код там не выполнится.
Оговорка про Россию: Microsoft в марте 2022 года приостановила новые продажи своих продуктов и сервисов в стране. VBA есть в уже установленных классических версиях Office. В российских пакетах макросы устроены иначе: в Р7-Офис они, по руководству по работе с макросами, пишутся на JavaScript, поэтому код VBA при переезде придётся переписать.
Как открыть редактор и написать первый код
Редактор Visual Basic установлен вместе с Office, его нужно только вызвать.
- Включите вкладку «Разработчик»: «Файл» → «Параметры» → «Настроить ленту», справа поставьте флажок «Разработчик» и нажмите кнопку OK.
- Откройте редактор кнопкой «Visual Basic» на этой вкладке или сочетанием Alt+F11. На Mac по справке о сочетаниях клавиш Excel это Option+F11.
- В меню редактора выберите Insert → Module (в русской справке Microsoft это меню называется «Вставка»). Справа откроется пустое окно кода стандартного модуля.
- Вставьте процедуру ниже, поставьте курсор внутрь неё и нажмите F5.
- Сохраните книгу в формате .xlsm, это книга с поддержкой макросов. Обычный .xlsx код не хранит, подробнее о разнице в статье про форматы Excel.
Sub FirstMacro()
Range("A1").Value = "Привет, VBA"
MsgBox "Готово: текст записан в A1"
End Sub
Процедура начинается со Sub и имени, а заканчивается End Sub. Строка с Range("A1").Value пишет текст в ячейку A1 активного листа, MsgBox показывает окно с сообщением.
Основы синтаксиса VBA
Язык многословный, зато читается почти как английский текст. Регистр букв в ключевых словах редактор поправит сам, а комментарий начинается с апострофа.
Ниже основа, с которой начинается любая программа. Если хочется пройти её с наставником и проверкой заданий, посмотрите курсы по VBA.
Переменные и типы данных
Переменную объявляют словом Dim. Первой строкой модуля стоит Option Explicit: тогда редактор не даст использовать необъявленную переменную. По справке, без этого оператора все необъявленные переменные получают тип Variant. Значит, опечатка в имени тихо создаёт новую пустую переменную.
Option Explicit
Sub Variables()
Dim userName As String
Dim rowsCount As Long
Dim price As Double
Dim isPaid As Boolean
userName = "Анна"
rowsCount = 1200
price = 1499.9
isPaid = True
Debug.Print userName, rowsCount, price, isPaid
End Sub
Debug.Print выводит значения в окно Immediate (Ctrl+G), так проверяют, что лежит в переменных. Дробная часть в коде пишется через точку, даже если в русском Excel вы привыкли к запятой.
| Тип | Что хранит | Диапазон |
|---|---|---|
| Integer | целое число | от –32 768 до 32 767 |
| Long | большое целое, номера строк | от –2 147 483 648 до 2 147 483 647 |
| Double | дробное число | двойная точность, 8 байт |
| String | текст | до приблизительно 2 миллиардов символов |
| Boolean | истина или ложь | True или False |
| Date | дата и время | с 1 января 100 г. по 31 декабря 9999 г. |
| Variant | что угодно | занимает больше памяти |
Диапазоны взяты из сводки типов данных VBA. Для счётчиков и номеров строк берите Long: в Integer номер строки быстро упирается в 32 767.
Условия: If и Select Case
Sub CheckScore()
Dim score As Long
score = Range("B2").Value
If score >= 85 Then
Range("C2").Value = "отлично"
ElseIf score >= 60 Then
Range("C2").Value = "зачёт"
Else
Range("C2").Value = "незачёт"
End If
End Sub
Когда вариантов много, цепочку ElseIf заменяют на Select Case: каждый вариант стоит отдельной строкой Case. Конструкция похожа на switch из других языков, его мы разбирали в статье про управляющие конструкции в C. Пример ниже проверяет день недели: с параметром vbMonday функция Weekday считает понедельник первым днём.
Select Case Weekday(Date, vbMonday)
Case 1 To 5
MsgBox "Рабочий день"
Case Else
MsgBox "Выходной"
End Select
Циклы: For, For Each, Do While
Циклы и делают VBA полезным: одно действие повторяется для каждой строки, листа или файла. Каждый такой повтор называется итерацией.
Dim i As Long
For i = 2 To 100
Cells(i, 3).Value = Cells(i, 1).Value * Cells(i, 2).Value
Next i
Dim cell As Range
For Each cell In Range("A2:A100")
cell.Value = Trim(cell.Value)
Next cell
Dim r As Long
r = 2
Do While Cells(r, 1).Value <> ""
r = r + 1
Loop
- For…Next идёт по счётчику: здесь перемножает столбцы A и B в строках со 2-й по 100-ю.
- For Each перебирает элементы коллекции: ячейки диапазона, листы книги.
- Do While крутится, пока условие верно: здесь ищет первую пустую ячейку в столбце A.
Процедуры Sub и функции Function
Sub выполняет действия, а Function возвращает значение. Функцию из обычного модуля можно вызвать прямо в ячейке, как встроенную.
Function PriceWithDiscount(price As Double, discount As Double) As Double
PriceWithDiscount = price * (1 - discount)
End Function
В русском Excel вызов выглядит так: =PriceWithDiscount(B2;0,1). Разделитель аргументов в ячейке, как и у встроенных функций, точка с запятой.
Объектная модель Excel: книга, лист, диапазон
Код на VBA почти всегда обращается к объектам. Объекты выстроены в иерархию, её называют объектной моделью. В Excel сверху Application, внутри книги, в книгах листы, на листах ячейки.
| Объект | Что это | Пример обращения |
|---|---|---|
| Application | сам Excel | Application.ScreenUpdating = False |
| Workbook | книга | ThisWorkbook.Save |
| Worksheet | лист | Worksheets("Отчёт").Activate |
| Range | ячейка или диапазон | Range("A1:C10").ClearContents |
| Cells | ячейка по номерам строки и столбца | Cells(5, 2).Value = 100 |
У объектов есть свойства (значение, цвет, имя) и методы (сохранить, удалить, скопировать). Точка связывает уровни: Worksheets(1).Range("A1").Value читается как «значение ячейки A1 на первом листе».
Последнюю заполненную строку находят через свойство Range.End. По справке оно эквивалентно нажатию End и стрелки. Поэтому Cells(Rows.Count, 1).End(xlUp).Row поднимается от низа листа к последней непустой ячейке столбца A. Этот приём встречается почти в каждом рабочем макросе, потому что количество строк в выгрузке каждый раз разное.
Пример: сводка по всем листам книги

Задача из жизни: в книге десяток листов с выгрузками, и нужно быстро увидеть, на каком сколько строк. Макрос создаёт лист «Сводка» первым в книге и пишет туда имя каждого листа и число строк с данными без шапки.
Sub SheetsSummary()
Dim ws As Worksheet
Dim summary As Worksheet
Dim r As Long
Application.DisplayAlerts = False
On Error Resume Next
ThisWorkbook.Worksheets("Сводка").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Set summary = ThisWorkbook.Worksheets.Add(Before:=ThisWorkbook.Worksheets(1))
summary.Name = "Сводка"
summary.Range("A1:B1").Value = Array("Лист", "Строк с данными")
r = 2
For Each ws In ThisWorkbook.Worksheets
If ws.Name <> summary.Name Then
summary.Cells(r, 1).Value = ws.Name
summary.Cells(r, 2).Value = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row - 1
r = r + 1
End If
Next ws
summary.Columns("A:B").AutoFit
End Sub
Что здесь происходит, по шагам:
- Старый лист «Сводка» удаляется, если он есть.
On Error Resume Nextне даёт макросу упасть, когда листа ещё нет, аDisplayAlerts = Falseубирает вопрос «точно удалить?». - Метод Worksheets.Add с параметром Before ставит новый лист перед первым.
- Цикл For Each проходит по всем листам, кроме самой сводки, и считает строки через End(xlUp). Минус один отнимает строку шапки.
- AutoFit подгоняет ширину столбцов под текст.
Счёт идёт по столбцу A. Если на каком-то листе первый столбец пустой, а данные начинаются со второго, поменяйте 1 в ws.Cells(ws.Rows.Count, 1) на номер нужного столбца.
Не каждая задача требует макроса. Итоги по самим данным, а не по листам, собирает сводная таблица, а подтянуть значения из справочника можно формулой ВПР.
Отладка: как найти, где сломался код
Ошибки в VBA бывают двух видов. Синтаксические редактор подсвечивает сразу при вводе строки, ошибки выполнения всплывают только при запуске. Для вторых в редакторе есть набор инструментов, клавиши взяты из справки по меню «Отладка» и меню «Вид».
| Клавиша | Что делает |
|---|---|
| F8 | выполняет код по одному оператору, видно, на какой строке что происходит |
| F9 | ставит или снимает точку останова на строке |
| Ctrl+G | открывает окно Immediate: туда пишет Debug.Print, там же можно вызвать процедуру или узнать значение переменной |
| Shift+F8 | выполняет вызванную процедуру целиком, не заходя внутрь |
| F2 | открывает обозреватель объектов со списком свойств и методов |
Новичку для начала хватает одной связки: точка останова перед подозрительным местом, дальше F8 по строке и наведение курсора на переменную, чтобы увидеть её текущее значение во всплывающей подсказке.
Частые ошибки новичка и что с ними делать

- Макрос пропал после сохранения. Книга сохранена в .xlsx, а этот формат код не хранит. Решение: пересохранить книгу в формате .xlsm.
- Ошибка 6, переполнение. Переменная объявлена как Integer, а значение больше 32 767, например номер строки в длинной выгрузке. Решение: объявить её как Long. Причины и варианты есть в справке по ошибке 6.
- Редактор ругается на переменную, которая вроде бы есть. В модуле стоит Option Explicit, а в имени опечатка или переменная не объявлена через Dim. Решение: объявить или исправить имя. Без Option Explicit опечатка не дала бы ошибки: код молча работал бы с новой пустой переменной.
- Макросы в файле из почты или интернета не запускаются. Office по умолчанию блокирует макросы в таких файлах, об этом есть отдельная статья Microsoft о блокировке. Для отдельного файла достаточно поставить флажок «Разблокировать» в его свойствах на вкладке «Общие», остальные варианты разобраны в статье про включение макросов.
- Код из записи макроса работает медленно. Запись ставит Select на каждое действие, и Excel послушно перещёлкивает ячейки. Решение: обращаться к ячейке напрямую, вместо пары
Range("B1").SelectиActiveCell.Value = …писатьRange("B1").Value = ….
Стоит ли учить VBA в 2026 году
Если вы работаете в классическом Excel, да. VBA, как сказано в той же справке о различиях со сценариями Office, встроен в классические версии Excel и не требует специальной лицензии. Если в компании уже есть книги с макросами, чинить и дописывать их придётся на VBA. А специалист по Excel без языка обычно упирается в потолок ручной работы.
У языка есть и пределы, о которых стоит знать заранее:
- Только десктоп. В браузерном и мобильном Excel код не выполнится. Для облака Microsoft развивает сценарии Office на TypeScript, но им нужна корпоративная или учебная лицензия.
- VBScript уходит, VBA остаётся. В плане отказа от VBScript Microsoft отдельно пишет о проектах VBA: если они вызывают файлы .vbs или используют VBScript как библиотеку, например для регулярных выражений, будущие этапы их затронут. Обычный код VBA это не касается.
- Часть задач решается без кода. Склеить и почистить выгрузки умеет Power Query: запрос собирается мышью, без программирования.
Как учить VBA с нуля: план на первые недели
- Записывайте макросы и читайте получившийся код. Microsoft в справке называет запись макроса великолепным средством для изучения VBA: видно, какими словами язык описывает ваши действия.
- Переписывайте записанное руками. Убирайте Select и Activate, заменяйте конкретные адреса переменными.
- Освойте переменные, условия и циклы на своих рабочих таблицах, а не на абстрактных задачах.
- Изучайте объекты по справке. Выделите слово в коде и нажмите F1, откроется описание свойства или метода с примерами. Полный список есть в справочнике по языку VBA.
- Напишите свою функцию для ячеек и макрос, который запускается при открытии книги.
- Возьмите реальную задачу целиком: еженедельный отчёт, который вы сейчас собираете руками, и автоматизируйте его до одной кнопки.
Если VBA станет вашим первым языком, логика переменных и циклов пригодится и дальше: она общая для большинства языков из подборки языков программирования для начинающих.
Где освоить VBA системно
Самостоятельно базу языка можно собрать по справке Microsoft и своим задачам. Курс экономит время на другом: даёт последовательную программу, разбор чужого кода и проверку ваших макросов наставником. Программы с ценами и отзывами выпускников ищите в разделе курсов по VBA, а если нужен Excel целиком, со сводными таблицами и формулами, загляните в курсы по Microsoft Excel.
| Курс | Школа | Стоимость со скидкой | В рассрочку | Длительность | Обзор курса от Checkroi |
|---|---|---|---|---|---|
| Программирование в VBA Перейти на сайт курса | 9205 ₽ | 767 ₽/мес. | 1 месяц | Обзор курса | |
| Профессия «Финансовый менеджер» Перейти на сайт курса | 90 514 ₽ | 3848 ₽/мес. | 8 месяцев | Обзор курса | |
| ДО Профессия Финансовый менеджер 2.0 Перейти на сайт курса | 77 238 ₽ | 2146 ₽/мес. | 3 месяца | Обзор курса | |
| Профессия «Инвестиционный аналитик» Перейти на сайт курса | 84 000 ₽ | 4666 ₽/мес. | 7 месяцев | Обзор курса | |
| Профессия «Финансовый аналитик» Перейти на сайт курса | 67 001 ₽ | 3722 ₽/мес. | 4 месяца | Обзор курса |
Больше программ — в полном каталоге курсов по VBA




