Редактор VBA и безопасность макросов
Осваиваем редактор VBA, разбираемся, куда класть код, почему файл обязан быть .xlsm — и как не поймать вирус вместе с чужим макросом.
VBE (Visual Basic Editor) — отдельное окно внутри Excel, в котором живёт весь код книги. Открывается по Alt+F11 и выглядит так, будто застряло в 1998 году. Так и есть — и это не мешает ему работать.
Что вы видите, нажав Alt+F11
Окно делится на несколько панелей. Разберём те, что вам действительно понадобятся.
- Project Explorer (слева вверху,
Ctrl+R, если пропал) — дерево всех открытых книг и того, что в них лежит: листы,ЭтаКнига(ThisWorkbook), модули, формы. - Properties (слева внизу,
F4) — свойства выбранного элемента. Новичку нужен редко. - Code window (справа, большое белое поле) — сам код. Открывается двойным кликом по любому элементу дерева.
- Immediate (
Ctrl+G) — «окно немедленного выполнения». Это ваша черновая тетрадь: сюда сыпется выводDebug.Print, и сюда можно ввести любую строку кода и нажать Enter, чтобы её выполнить прямо сейчас.
Куда класть код: модули и их виды
В дереве проекта вы увидите разные «контейнеры» для кода, и это не одно и то же.
| Куда | Что туда кладут |
Стандартный модуль (Insert → Module, появляется в папке Modules) | Обычные макросы. 95% вашего кода — здесь. Только код из стандартного модуля виден в списке «Макросы» (Alt+F8) и может быть повешен на кнопку. |
| Модуль листа (двойной клик по листу в дереве) | Реакции на события именно этого листа: «пользователь изменил ячейку», «выделил другую область». |
| ЭтаКнига / ThisWorkbook | События всей книги: «книга открылась», «книгу сохраняют», «книгу закрывают». |
| Формы (UserForm) и классы | Диалоговые окна и продвинутые конструкции. Позже. |
Типичная ошибка новичка: написать макрос в модуле листа и потом не найти его в списке Alt+F8. Правило простое: обычный макрос → стандартный модуль.
Создадим первый модуль: Insert → Module, и пишем руками, без рекордера:
Sub Hello()
MsgBox "Привет! Это мой первый макрос.", vbInformation, "CodeChick"
End Sub
Поставьте курсор внутрь этого Sub и нажмите F5 — появится окно с сообщением. MsgBox принимает текст, тип значка (vbInformation — синяя «i») и заголовок окна.
Три инструмента отладки, которые экономят вечера
F8 — пошаговый запуск
Вместо F5 нажимайте F8: код выполнится по одной строке за нажатие, а текущая строка подсветится жёлтым. Это лучший способ понять, что макрос делает на самом деле, а не что вам кажется.
Точка останова
Кликните по серой полосе слева от строки — появится коричневая точка. Запустите макрос по F5: он домчится до этой строки и остановится. Дальше — F8, по шагам.
Debug.Print и окно Immediate
Иногда нужно просто «посмотреть, что там в переменной». Не выводите это через MsgBox — задолбаетесь закрывать окошки. Пишите в Immediate:
Sub CheckRows()
Dim ws As Worksheet
Dim lastRow As Long
Set ws = ThisWorkbook.Worksheets("Выгрузка")
lastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
Debug.Print "Последняя строка с данными: " & lastRow
Debug.Print "Имя листа: " & ws.Name
End Sub
Результат (в окне Immediate, Ctrl+G):
Последняя строка с данными: 418
Имя листа: Выгрузка
Символ & в VBA склеивает текст: "Строк: " & 418 даёт "Строк: 418".
Option Explicit — настройка, которую надо включить прямо сейчас
По умолчанию VBA разрешает использовать переменные, которых вы не объявляли. Звучит удобно, работает как мина замедленного действия:
Sub Total()
Dim itogo As Double
itogo = 100
itgo = itogo + 50 ' опечатка: itgo вместо itogo
MsgBox itogo ' покажет 100, а не 150
End Sub
VBA молча создал новую переменную itgo, положил туда 150 — и пошёл дальше. Макрос не упал, ошибки не показал, просто посчитал неправильно. В отчёте по деньгам это худший из возможных сценариев.
Лечится одной строкой в начале модуля:
Option Explicit
Sub Total()
Dim itogo As Double
itogo = 100
itgo = itogo + 50
MsgBox itogo
End Sub
Теперь при запуске VBA остановится и скажет: Variable not defined, подсветив itgo. Опечатка поймана до того, как испортила отчёт.
Чтобы Option Explicit добавлялся во все новые модули автоматически: Tools → Options → вкладка Editor → галочка «Require Variable Declaration». Сделайте это один раз и забудьте.
Формат файла: почему .xlsx молча съедает ваш код
Обычный .xlsx не умеет хранить макросы. Если вы напишете код и нажмёте «Сохранить», Excel покажет предупреждение — и, если промахнуться мимо кнопки, сохранит книгу без кода. Молча. Навсегда.
| Формат | Хранит макросы? | Когда использовать |
.xlsx | Нет | Обычные книги без кода |
.xlsm | Да | Ваш основной формат для книг с макросами |
.xlsb | Да | Двоичный формат: быстрее и легче на больших файлах |
.xlam | Да | Надстройка: набор макросов, доступный во всех книгах |
Сохраняйте через Файл → Сохранить как → «Книга Excel с поддержкой макросов (*.xlsm)». Само расширение в имени файла — уже полезная подсказка коллегам: «здесь есть код».
Безопасность: почему Excel боится макросов
Макрос — это не «формула посложнее». Это полноценная программа с правами вашей учётной записи. Она может читать и удалять файлы на диске, лезть в сеть, скачивать и запускать другие программы, рассылать письма от вашего имени через Outlook. Никакой песочницы вокруг неё нет.
Хуже того, макрос умеет запускаться сам, при открытии файла — для этого достаточно процедуры с именем Auto_Open или события Workbook_Open в модуле ЭтаКнига:
Private Sub Workbook_Open()
MsgBox "Этот код выполнился сам, как только вы открыли файл."
End Sub
Именно на этом построены классические офисные вирусы: вам присылают «акт сверки.xlsm», вы жмёте «Включить содержимое» — и код отрабатывает мгновенно, ещё до того, как вы взглянули на таблицу. Так распространялись и шифровальщики, и банковские трояны. Это не страшилка, это будни корпоративной почты.
Настройки безопасности макросов
Идём в Файл → Параметры → Центр управления безопасностью → Параметры центра управления безопасностью → Параметры макросов. Там четыре варианта:
| Вариант | Что значит | Вердикт |
| Отключить все макросы без уведомления | Код не запустится никогда, вы даже не узнаете, что он там был | Безопасно, но работать нельзя |
| Отключить все макросы с уведомлением | Excel покажет жёлтую полосу «Включить содержимое» — решение за вами | Правильный выбор (стоит по умолчанию) |
| Отключить, кроме макросов с цифровой подписью | Работают только подписанные сертификатом файлы | Хорошо для крупных компаний |
| Включить все макросы | Любой файл выполнит любой код без вопросов | Никогда. Не включайте это. |
Правильный режим — «Отключить с уведомлением». А чтобы не жать «Включить содержимое» по двадцать раз в день на своих же файлах, есть цивилизованный способ: Надёжные расположения (там же, в Центре управления безопасностью). Добавьте туда одну свою рабочую папку — макросы из файлов в ней будут запускаться без вопросов. Никогда не добавляйте туда папку «Загрузки» и не ставьте галочку на весь диск.
Красная плашка: файлы из интернета
В современных версиях Excel для файлов, скачанных из интернета или пришедших почтой, показывается уже не жёлтая, а красная полоса: «Microsoft заблокировала выполнение макросов, так как источник файла не является надёжным». Кнопки «Включить» там нет вообще — и это сделано специально.
Windows помечает такие файлы меткой Mark of the Web — «этот файл пришёл извне». Снять её можно через правый клик по файлу → Свойства → внизу галочка «Разблокировать». Делайте это только если вы точно знаете отправителя, ждали этот файл и понимаете, что за код внутри. Во всех остальных случаях красная плашка — это не препятствие, а спасательный круг.
И отдельно: прежде чем включать макросы в чужом файле, откройте Alt+F11 и прочитайте код. Вы уже умеете это делать. Если в модуле ЭтаКнига есть Workbook_Open, а в коде мелькают Shell, Kill или обращения к интернету — закройте файл и напишите в IT-отдел.
Как это работает
Код VBA хранится внутри файла Excel отдельным потоком данных — именно поэтому формат .xlsm отличается от .xlsx не содержимым таблиц, а наличием «отсека» под код. Excel при открытии книги видит этот отсек, проверяет настройку безопасности и метку происхождения файла, и только потом решает: выполнять Workbook_Open или показать полосу с предупреждением. Ваш выбор «Включить содержимое» запоминается для конкретного файла — второй раз спрашивать не будут, поэтому первое решение и есть самое важное.
Частые ошибки
- Поставить «Включить все макросы» и забыть. Это как отключить пожарную сигнализацию, потому что она пищит. Один заражённый «акт сверки» — и дальше по всей сети.
- Сохранить книгу с кодом в .xlsx. Excel предупредит один раз; проигнорируете — потеряете весь код без возможности вернуть.
- Не включить Option Explicit. Опечатка в имени переменной не свалит макрос — она тихо испортит цифры.
- Писать обычный макрос в модуле листа и потом искать его в Alt+F8. Обычные макросы живут в стандартном модуле.
- Добавить в надёжные расположения папку «Загрузки» или весь диск C. Это ровно то же самое, что «включить все макросы», только окольным путём.
- Забыть, что личная книга макросов (PERSONAL.XLSB) живёт на вашем компьютере. Коллеге вы отправите файл — а макроса в нём не будет.
Итоги
- Alt+F11 — редактор. Дерево проекта слева, код справа, Ctrl+G — окно Immediate для
Debug.Print. - Обычные макросы кладут в стандартный модуль (
Insert → Module) — только они видны в Alt+F8. - F5 — запустить, F8 — по шагам, точка останова — остановиться в нужном месте.
Option Explicit+ галочка «Require Variable Declaration» ловят опечатки, которые иначе тихо портят расчёты.- Книга с кодом сохраняется только как .xlsm (или .xlsb).
.xlsxкод не хранит. - Режим безопасности — «Отключить с уведомлением», свою рабочую папку — в надёжные расположения. «Включить все макросы» — никогда.
- Макрос из письма или из интернета — потенциальный вирус: он может запуститься сам через
Workbook_Open. Сначала прочитайте код, потом решайте.