Перейти к основному содержимому

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: основыпервая программа.


Где пишут код

  1. Откройте книгу Excel (для макросов лучше сразу .xlsm — с поддержкой макросов).
  2. Alt+F11 — редактор VBA (VBE).
  3. Insert → Module — стандартный модуль с процедурами.
  4. Insert → UserForm — окно с кнопками и полями (аналог формы VB6).

Процедуры в модуле:

Sub Hello()
MsgBox "Hello from VBA"
End Sub

Запуск: в VBE F5 или в Excel Разработчик → Макросы → выбрать Hello.

Вкладку Разработчик включают в параметрах Excel, если её нет в ленте.


Объектная модель Excel (минимум)

Иерархия, с которой работают почти все макросы:

УровеньТипПример
ПриложениеApplicationApplication.ScreenUpdating = False
КнигаWorkbookWorkbooks("Report.xlsx")
ЛистWorksheetWorksheets(1) или Sheets("Данные")
Ячейка/диапазонRangeRange("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).

См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).