Редактор 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. Сначала прочитайте код, потом решайте.
Проверьте себя
1. Вы написали макрос и сохранили книгу в формате .xlsx, нажав «Да» на предупреждение. Что произойдёт с кодом?
AКод сохранится, но будет отключён до следующего открытия файла
BКод будет удалён из файла — .xlsx не хранит макросы
CExcel автоматически сменит расширение на .xlsm и сохранит код
DКод переедет в личную книгу макросов PERSONAL.XLSB
2. Коллега прислал по почте файл «сверка.xlsm». Excel показал красную полосу «Microsoft заблокировала выполнение макросов». Как поступить правильно?
AСразу поставить в параметрах «Включить все макросы» — так плашка больше не появится
BДобавить папку «Загрузки» в надёжные расположения
CУбедиться, что файл действительно ждали, открыть Alt+F11 и прочитать код, и только потом снимать блокировку через Свойства файла
DПересохранить файл в .xlsx — тогда предупреждение исчезнет