VBA: что это за язык и как начать программировать в Excel

VBA встроен в Excel, Word и Outlook, на нём пишут макросы.

Показываем, как открыть редактор сочетанием Alt+F11, написать первую процедуру и разобраться с переменными, условиями, циклами и объектами Excel.

В конце пример макроса со сводкой по листам, отладка и пять частых ошибок новичка.

Статью написал:
Ваня Буявец, продюсер, основатель Checkroi
Ваня Буявец
Основатель Checkroi, продюсер, эксперт в выборе онлайн-курсов
Все 3210 статей автора Подписаться на Телеграм-канал
Одобрено экспертом:
Наташа Буявец, основатель Checkroi, эксперт по онлайн-курсам
Наташа Буявец
Основательница Checkroi, продюсер Youtube-каналов, эксперт по онлайн-курсам
Все 3864 экспертных мнения Подписаться на Телеграм-канал
Обложка: VBA: что это за язык и как начать программировать в Excel

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

Если вам нужно только записать действия мышью и повторить их кнопкой, хватит инструкции про макросы в Excel. Здесь разберём сам язык: синтаксис, объекты Excel, отладку и то, как его учить.

CheckroiCheckroiПодборка курсов по VBA38 курсов • 15 школСравните цены, школы, программу и найдите выгодные предложения по обучениюСравнить→

Что такое VBA и где он работает

Рой за ноутбуком с открытой таблицей Excel и редактором кода

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, его нужно только вызвать.

  1. Включите вкладку «Разработчик»: «Файл» → «Параметры» → «Настроить ленту», справа поставьте флажок «Разработчик» и нажмите кнопку OK.
  2. Откройте редактор кнопкой «Visual Basic» на этой вкладке или сочетанием Alt+F11. На Mac по справке о сочетаниях клавиш Excel это Option+F11.
  3. В меню редактора выберите Insert → Module (в русской справке Microsoft это меню называется «Вставка»). Справа откроется пустое окно кода стандартного модуля.
  4. Вставьте процедуру ниже, поставьте курсор внутрь неё и нажмите F5.
  5. Сохраните книгу в формате .xlsm, это книга с поддержкой макросов. Обычный .xlsx код не хранит, подробнее о разнице в статье про форматы Excel.
Sub FirstMacro()
    Range("A1").Value = "Привет, VBA"
    MsgBox "Готово: текст записан в A1"
End Sub

Процедура начинается со Sub и имени, а заканчивается End Sub. Строка с Range("A1").Value пишет текст в ячейку A1 активного листа, MsgBox показывает окно с сообщением.

Канал основателя Checkroi Вани Буявца3 800 человек читают мой Телеграм-канал про нейросетиСобрал промпты для Claude Code и ChatGPT, разборы ИИ-инструментов и лайфхаки по продвижению бизнеса в одном местеПрисоединиться

Основы синтаксиса 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

Что здесь происходит, по шагам:

  1. Старый лист «Сводка» удаляется, если он есть. On Error Resume Next не даёт макросу упасть, когда листа ещё нет, а DisplayAlerts = False убирает вопрос «точно удалить?».
  2. Метод Worksheets.Add с параметром Before ставит новый лист перед первым.
  3. Цикл For Each проходит по всем листам, кроме самой сводки, и считает строки через End(xlUp). Минус один отнимает строку шапки.
  4. AutoFit подгоняет ширину столбцов под текст.

Счёт идёт по столбцу A. Если на каком-то листе первый столбец пустой, а данные начинаются со второго, поменяйте 1 в ws.Cells(ws.Rows.Count, 1) на номер нужного столбца.

Не каждая задача требует макроса. Итоги по самим данным, а не по листам, собирает сводная таблица, а подтянуть значения из справочника можно формулой ВПР.

Отладка: как найти, где сломался код

Ошибки в VBA бывают двух видов. Синтаксические редактор подсвечивает сразу при вводе строки, ошибки выполнения всплывают только при запуске. Для вторых в редакторе есть набор инструментов, клавиши взяты из справки по меню «Отладка» и меню «Вид».

Клавиша Что делает
F8 выполняет код по одному оператору, видно, на какой строке что происходит
F9 ставит или снимает точку останова на строке
Ctrl+G открывает окно Immediate: туда пишет Debug.Print, там же можно вызвать процедуру или узнать значение переменной
Shift+F8 выполняет вызванную процедуру целиком, не заходя внутрь
F2 открывает обозреватель объектов со списком свойств и методов

Новичку для начала хватает одной связки: точка останова перед подозрительным местом, дальше F8 по строке и наведение курсора на переменную, чтобы увидеть её текущее значение во всплывающей подсказке.

Ваня БуявецКанал основателя Checkroi Вани БуявцаЗабирайте промпты и обучение по нейросетям в моём Телеграм-каналеБольше 3 800 человек уже применяют Claude Code, ChatGPT и другие нейросети в работе, учёбе, бизнесе и жизниПерейти в канал

Частые ошибки новичка и что с ними делать

Рой довольно находит ошибку в коде, на экране подсвечена строка
  • Макрос пропал после сохранения. Книга сохранена в .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 с нуля: план на первые недели

  1. Записывайте макросы и читайте получившийся код. Microsoft в справке называет запись макроса великолепным средством для изучения VBA: видно, какими словами язык описывает ваши действия.
  2. Переписывайте записанное руками. Убирайте Select и Activate, заменяйте конкретные адреса переменными.
  3. Освойте переменные, условия и циклы на своих рабочих таблицах, а не на абстрактных задачах.
  4. Изучайте объекты по справке. Выделите слово в коде и нажмите F1, откроется описание свойства или метода с примерами. Полный список есть в справочнике по языку VBA.
  5. Напишите свою функцию для ячеек и макрос, который запускается при открытии книги.
  6. Возьмите реальную задачу целиком: еженедельный отчёт, который вы сейчас собираете руками, и автоматизируйте его до одной кнопки.

Если VBA станет вашим первым языком, логика переменных и циклов пригодится и дальше: она общая для большинства языков из подборки языков программирования для начинающих.

Где освоить VBA системно

Самостоятельно базу языка можно собрать по справке Microsoft и своим задачам. Курс экономит время на другом: даёт последовательную программу, разбор чужого кода и проверку ваших макросов наставником. Программы с ценами и отзывами выпускников ищите в разделе курсов по VBA, а если нужен Excel целиком, со сводными таблицами и формулами, загляните в курсы по Microsoft Excel.

КурсШколаСтоимость со скидкойВ рассрочкуДлитель­ностьОбзор курса от Checkroi
Программирование в VBA
Перейти на сайт курса
SF EducationSF Education9205 ₽767 ₽/мес.1 месяцОбзор курса
Профессия «Финансовый менеджер»
Перейти на сайт курса
SkillboxSkillbox90 514 ₽3848 ₽/мес.8 месяцевОбзор курса
ДО Профессия Финансовый менеджер 2.0
Перейти на сайт курса
GeekBrainsGeekBrains77 238 ₽2146 ₽/мес.3 месяцаОбзор курса
Профессия «Инвестиционный аналитик»
Перейти на сайт курса
SF EducationSF Education84 000 ₽4666 ₽/мес.7 месяцевОбзор курса
Профессия «Финансовый аналитик»
Перейти на сайт курса
SF EducationSF Education67 001 ₽3722 ₽/мес.4 месяцаОбзор курса

Больше программ — в полном каталоге курсов по VBA

Часто задаваемые вопросы

Что такое VBA простыми словами?

Встроенный язык программирования Microsoft Office. На нём пишут макросы, которые сами выполняют повторяющиеся действия в Excel, Word, Outlook и других приложениях пакета.

Чем VBA отличается от макроса?

Макрос это готовая программа, а VBA язык, на котором она написана. Записанный макрос Excel тоже сохраняет кодом VBA, его можно открыть в редакторе и поправить.

Работает ли VBA в Excel онлайн и на Mac?

В Excel для Mac работает. В Excel в браузере и в Excel для iOS макросы VBA не запускаются. Для веб-версии у Microsoft есть сценарии Office, но им нужна корпоративная или учебная лицензия.

Как открыть редактор VBA?

Нажмите Alt+F11 в Excel для Windows или Option+F11 на Mac. Ещё можно нажать кнопку «Visual Basic» на вкладке «Разработчик», но вкладку сначала нужно включить в настройках ленты.

Нужно ли уметь программировать, чтобы начать учить VBA?

Нет. Первые макросы можно записать мышью, а потом читать и править получившийся код. Переменные, условия и циклы осваивают на своих рабочих таблицах.

Можно ли перенести макросы VBA в Р7-Офис?

Напрямую нет. В Р7-Офис макросы пишутся на JavaScript, поэтому код VBA при переезде переписывают.

Читайте Checkroi первым в Google
Добавьте Checkroi в избранные источники — и наши разборы курсов и обзоры школ будут показываться выше в вашей выдаче Google.
Оставить комментарий
0 комментариев
Форма комментария

Оставьте комментарий

Напишите, что думаете. Нам важно ваше мнение!