Найти в Дзене
Макрос решает

"Шпион в Excel": как отследить, кто и когда открывал файл — магия события Workbook_Open

Оглавление

Когда вы работаете с Excel-документом, к которому имеют доступ другие пользователи, возникает вполне закономерный вопрос: а кто открывал файл и когда это произошло? И здесь на помощь приходит событие Workbook_Open, с которым мы сегодня проведём настоящее расследование.

Вы научитесь создавать невидимый лог активности, отслеживать имя пользователя, дату и время открытия книги, а также узнаете важные отличия между похожими событиями рабочей книги. Всё это — с чёткой логикой, понятным кодом и реальной практической пользой.

📘 Что такое событие Workbook_Open

sWorkbook_Open — это встроенное событие в Excel VBA, которое срабатывает один раз, когда кто-либо открывает файл Excel, при условии, что в нём включены макросы.

Это событие удобно использовать для:

  • логирования пользователей;
  • отображения приветственного окна;
  • инициализации данных при запуске;
  • проверки доступа;
  • обновления внешних ссылок или формул.

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

🧪 Начинаем: где писать код

Все события книги пишутся в модуле "ЭтаКнига" (ThisWorkbook). Чтобы попасть туда:

  1. Нажмите Alt + F11 — откроется редактор VBA.
  2. В проекте слева дважды щёлкните ThisWorkbook.
  3. В выпадающем списке слева выберите Workbook, а справа — Open.

Теперь вы готовы писать код.

Создайте новый лист в вашей книге и назовите его, например, Лог.

Переименуйте его, если хотите, и
сделайте скрытым: ПКМ по вкладке → Скрыть.

В ячейке A1 напишите Имя пользователя, в B1 — Дата и время.

Теперь — к коду.

🧠 Шаг 2. Логика макроса

Нам нужно:

  1. Получить ссылку на лист Лог.
  2. Найти последнюю незаполненную строку.
  3. Записать в неё имя пользователя и текущее время.

Вот как это реализуется:

Private Sub Workbook_Open()

Dim t1 As Worksheet

Set t1 = ThisWorkbook.Sheets("Лог")

Dim LastRow As Long

LastRow = t1.Cells(Rows.Count, 1).End(xlUp).Row + 1

t1.Cells(LastRow, 1).Value = Application.UserName

t1.Cells(LastRow, 2).Value = Now

End Sub

🔍 Разбор кода по частям

  • ThisWorkbook.Sheets("Лог") — доступ к нужному листу.
  • Cells(Rows.Count, 1).End(xlUp).Row + 1 — находим первую пустую строку в столбце A.
  • Application.UserName — имя текущего пользователя Windows.
  • Now — текущие дата и время.

После открытия файла макрос добавит в скрытый лист новую строку с данными.

📌 Практический пример

Откройте файл.

Затем снова зайдите в редактор, сделайте лист Лог видимым и вы увидите:

Имя пользователяДата и время открытияIvan Petrov14.06.2025 22:13:01Ivan Petrov14.06.2025 22:14:56

Таким образом, вы точно знаете, кто и когда открывал документ.

🧠 Советы по улучшению

  • 💾 Храните лог в отдельном файле, если не хотите, чтобы пользователи его чистили.
  • 🔐 Защитите лист с логами паролем от изменений.
  • 👤 Используйте переменную Environ("USERNAME") для получения имени учётной записи, если Application.UserName не подходит.

📢 Подписывайтесь, если вам нравится такая автоматизация!

Если вам интересны умные, практичные VBA-решения, которые реально помогают в работе с Excel, — подписывайтесь на канал Powerworcel. Здесь всё объясняется простыми словами и с фокусом на полезность.

✍ В комментариях напишите: а вы отслеживаете, кто открывает ваши файлы? Какие приёмы используете?

🔄 Бонус: отличие между Workbook_Open и Workbook_Activate

Многие путают эти два события. Разберёмся:

СобытиеКогда срабатываетWorkbook_OpenТолько один раз — при открытии файлаWorkbook_ActivateКаждый раз, когда пользователь переходит к книге

❗ Но Workbook_Activate не сработает, если пользователь просто сворачивает Excel и возвращается обратно. Оно срабатывает только при переключении между разными книгами Excel.

Пример кода для Workbook_Activate:

Private Sub Workbook_Activate()

MsgBox "Вы снова выбрали эту книгу!"

End Sub

🧠 Где это можно использовать?

  • 💼 В корпоративных Excel-системах для контроля доступа.
  • 🧾 При автоматическом заполнении истории работы с документом.
  • 🎓 В учебных проектах для отслеживания студентов.
  • 🤖 В сборе статистики использования макросов и Excel-файлов.

🧱 Расширения идеи

Хотите продвинутую версию?

  • Записывайте также имя листа, открытого по умолчанию.
  • Добавьте столбец с информацией о времени бездействия в файле.
  • Используйте Workbook_BeforeClose, чтобы зафиксировать, кто закрывал книгу.

📬 Подводим итоги

Событие Workbook_Open — это незаменимый инструмент для профессиональных Excel-разработчиков. Оно даёт возможность автоматически реагировать на открытие книги: запускать макросы, логировать действия, проверять пользователей и многое другое.

Не забывайте: простой код — не значит слабый код. Даже небольшие приёмы могут дать вам полный контроль над рабочими процессами.

🎯 А дальше?

В следующем уроке вы узнаете:

  • как реагировать на сохранение книги с помощью Workbook_BeforeSave;
  • как отменить сохранение, если не выполнено важное условие;
  • как автоматически сохранять резервную копию.

Вы уже подписались, чтобы не пропустить новую статью?