VBA в Microsoft Excel
Зачем отдельная глава
VBA (Visual Basic for Applications) — это не VB.NET и не VB 6.0, а встроенный диалект Basic в приложениях Microsoft Office. Синтаксис (Sub, Dim, If…Then, циклы) узнаваем, но код живёт внутри документа (.xlsm, .docm), выполняется средой Office и опирается на объектную модель конкретной программы.
В Excel VBA до сих пор массово используют для отчётов, выгрузок, макросов кнопок и автоматизации таблиц — часто без отдельной «большой» IDE.
Сравнение ветвей: о разделе. Учебный курс VB.NET: основы → первая программа.
Где пишут код
- Откройте книгу Excel (для макросов лучше сразу
.xlsm— с поддержкой макросов). - Alt+F11 — редактор VBA (VBE).
- Insert → Module — стандартный модуль с процедурами.
- Insert → UserForm — окно с кнопками и полями (аналог формы VB6).
Процедуры в модуле:
Sub Hello()
MsgBox "Hello from VBA"
End Sub
Запуск: в VBE F5 или в Excel Разработчик → Макросы → выбрать Hello.
Вкладку Разработчик включают в параметрах Excel, если её нет в ленте.
Объектная модель Excel (минимум)
Иерархия, с которой работают почти все макросы:
| Уровень | Тип | Пример |
|---|---|---|
| Приложение | Application | Application.ScreenUpdating = False |
| Книга | Workbook | Workbooks("Report.xlsx") |
| Лист | Worksheet | Worksheets(1) или Sheets("Данные") |
| Ячейка/диапазон | Range | Range("A1"), Range("B2:D10") |
Типичные операции:
Sub FillHeader()
Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets("Sales")
ws.Range("A1").Value = "Date"
ws.Range("B1").Value = "Amount"
ws.Range("A2").Value = Date
ws.Range("B2").Value = 1500
End Sub
Set в VBA нужен для присваивания объектных ссылок (в VB.NET для managed-объектов обычно пишут просто =).
Обход диапазона:
Sub SumColumnB()
Dim cell As Range
Dim total As Double
total = 0
For Each cell In Worksheets(1).Range("B2:B100")
If IsNumeric(cell.Value) Then
total = total + cell.Value
End If
Next cell
Worksheets(1).Range("B101").Value = total
End Sub
Процедура с параметрами и функция
Function Discount(price As Double, percent As Double) As Double
Discount = price * (1 - percent / 100)
End Function
Sub ApplyDiscount()
Dim result As Double
result = Discount(1000, 10)
Range("C1").Value = result
End Sub
Имя функции, как в классическом Basic, можно использовать для возврата значения (Discount = …), либо Discount = … в конце — оба стиля встречаются в legacy-коде.
События книги и листа
Код можно разместить в ThisWorkbook или в модуле листа (Sheet1), тогда процедуры привязываются к событиям:
' Модуль листа Sheet1
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A:A")) Is Nothing Then
Application.EnableEvents = False
Target.Offset(0, 1).Value = UCase(Target.Value)
Application.EnableEvents = True
End If
End Sub
Application.EnableEvents = False временно отключает повторный вход в обработчик при изменении ячеек из самого макроса.
Ошибки: On Error (VBA) vs Try (VB.NET)
В VBA по-прежнему распространён шаблон:
Sub SafeRead()
On Error GoTo ErrHandler
Dim value As Double
value = Range("A1").Value / Range("B1").Value
Exit Sub
ErrHandler:
MsgBox "Ошибка: " & Err.Description
End Sub
В VB.NET предпочитают Try…Catch…Finally (см. процедуры и события).
Безопасность и сопровождение
- Макросы могут запускать внешние программы и менять файлы — Excel предупреждает о непроверенных макросах.
- Храните логику в модулях, а не размазанной по ячейкам; именуйте процедуры по действию (
ExportSales,ValidateInput). - Для новых интеграций Microsoft продвигает Office Scripts (JavaScript, облако) и Power Automate, но сложная логика в Excel по-прежнему часто остаётся на VBA.
- Идентификаторы в коде лучше писать латиницей (
total,ws) — так проще ревью и поиск по репозиторию; кириллица в именах переменных допустима, но редка в командах.
VBA из VB.NET (Interop)
Управлять Excel из VB.NET можно через COM Interop (отдельная сборка, развёртывание, права). Для макросов «внутри таблицы» VBA остаётся проще. Пример late binding из .NET см. в справочнике, интеграция.
Что изучить дальше
- Типы VBA:
Integer,Long,Double,String,Variant,Object. Collection,Dictionary(черезScripting.Dictionaryпри подключении ссылки).UserForm,ListBox,ComboBox.- Запись/чтение CSV,
Workbooks.Open,SaveAs. - Справочник по синтаксису: 711 (помечайте фрагменты VBA / VB6 vs VB.NET).
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). История Visual Basic - эволюция от BASIC до современных реализаций в экосистеме Microsoft. Основы языка Visual Basic - синтаксис, базовые конструкции и роль VB в обучении программированию. Архитектура приложений на Visual Basic - структура проекта, компоненты и подходы к построению Windows-приложений. Типизация, набор правил определения типа данных значений языка. Управляющие конструкции и операторы Visual Basic - условные блоки, циклы и выражения в прикладном коде. Процедуры и события в Visual Basic - обработчики, жизненный цикл событий и организация прикладной логики. Гайд по установке и настройке с написанием первой программы и её запуском. Справочник-шпаргалка по visual-basic — типы, синтаксис, стандартная библиотека, типовые паттерны. Не заменяет пошаговое обучение. Учебный курс — раздел.История языка visual-basic
Основы языка visual-basic
Архитектура приложений на visual-basic
Типы данных в visual-basic
Управляющие конструкции и операторы visual-basic
Процедуры и события в visual-basic
Первая программа на visual-basic
Справочник по visual-basic