Перейти к содержимому
Наше приложение «Дешевые авиабилеты» в AppGallery >>

VBA Excel. Открыт ли файл — как проверить?

    Как проверить, открыт ли файл, с помощью VBA Excel? Проверка, открыт ли файл, через попытку блокировки и через коллекцию Application.Workbooks.

    Введение

    При автоматизации в Excel часто возникает необходимость определить, открыт ли файл в данный момент. Это особенно важно при совместной работе с отчётами, сетевыми папками, общими файлами и макросами, выполняемыми по расписанию.

    Если не учитывать этот момент, можно столкнуться с ошибками записи, потерей данных или повреждением файлов.

    В данной статье рассмотрены два основных сценария проверки, чтобы узнать, открыт ли файл:

    1. Проверка через попытку открытия и блокировки (для любого файла).
    2. Проверка через коллекцию Application.Workbooks (для Excel-файла).

    Проверка файла через попытку блокировки

    Суть метода:

    В ОС Windows открытый процесс обычно блокирует файл, не давая другим программам редактировать его и, тем более, удалять. В коде ниже VBA пытается открыть файл в бинарном режиме с одновременной блокировкой на чтение и запись. Если файл уже используется другим процессом (Excel, Word, пользователь в сети и т. д.), Windows не разрешит такую операцию, и VBA вернёт ошибку.

    На основе этой ошибки и делается вывод: открыт ли файл или нет.

    Особенность блокировки файлов в разных приложениях:

    Важно отметить, что не все приложения блокируют файлы при открытии. Например, текстовые редакторы, такие как Блокнот или Notepad++, не ставят блокировку на текстовые файлы. Эти программы просто открывают файл для чтения и редактирования, не запрещая другим процессам доступ к нему.

    Аналогичная ситуация наблюдается и с графическими редакторами, которые работают с изображениями: такие программы не блокируют файлы, позволяя другим приложениям или пользователям открывать и изменять их. Проверил эту информацию в редакторах изображений GIMP и Paint, в программах Ножницы и Фотографии — во всех перечисленных приложениях открытый файл не заблокирован.

    В отличие от вышеназванных программ, Excel, Word и другие приложения, работающие с данными в таблицах или базах данных, или применяющие сложное форматирование текста, используют блокировку для предотвращения одновременной записи в файл, что позволяет избежать конфликтов данных и ошибок при сохранении изменений.

    Если открыть обычный текстовый файл (.txt) с помощью программы Word, то файл будет заблокирован.

    Код функции VBA с попыткой блокировки файла:

    Как работает код:

    1. Сначала код проверяет, существует ли файл, так как если файл не существует, инструкция Open, используемая в бинарном режиме, создаст текстовый файл с указанным именем.
    2. VBA пытается открыть файл в бинарном режиме.
    3. Запрашивается блокировка Lock Read Write.
    4. Если файл уже открыт другим процессом — возникает ошибка.
    5. По наличию ошибки определяется результат.

    Возвращаемые значения:

    • True — файл открыт или заблокирован (например, в диалоге «Свойства» файла установлен атрибут «Только чтение»).
    • False — файл закрыт (или открыт, но не заблокирован) и доступен для работы.

    Пример использования:

    Преимущества метода:

    • Работает с любыми типами файлов (Excel, Word, PDF и др.).
    • Подходит для сетевых папок.
    • Не требует использования Windows API.
    • Надёжен в корпоративной среде.

    Недостатки метода:

    • Не все программы блокируют открытые ими файлы (впрочем, вряд ли это помешает работать с таким файлом).
    • Может вернуть ложный результат при отсутствии прав доступа.

    Когда использовать:

    • Автоматическая запись отчётов.
    • Проверка доступности файлов.
    • Работа с сетевыми ресурсами.

    Проверка книги через коллекцию Workbooks

    Суть метода:

    Excel хранит список всех открытых книг в коллекции Application.Workbooks. Если нужный файл присутствует в этой коллекции — значит, он открыт в текущем экземпляре Excel.

    Если у пользователя запущено два отдельных окна Excel (два процесса excel.exe), этот метод не увидит файл, открытый во втором окне. В этом случае поможет только первый метод (Функция IsFileOpen).

    Код функции VBA с перебором открытых книг Excel:

    Как работает код:

    1. VBA перебирает все открытые книги Excel.
    2. Сравнивает полный путь файла.
    3. Если совпадение найдено — файл открыт.

    Стоит отметить, что в этой функции можно использовать не полный путь файла, а только имя книги. Для этого надо wb.FullName в четвёртой строке заменить на wb.Name.

    Возвращаемые значения:

    • True — файл открыт в текущем экземпляре Excel.
    • False — файл не открыт в текущем экземпляре.

    Пример использования:

    Преимущества метода:

    • Очень высокая скорость работы.
    • Отсутствие ошибок и блокировок.
    • Безопасен для данных.
    • Идеален для логики внутри одного экземпляра Excel.

    Недостатки метода:

    • Работает только с Excel-файлами.
    • Видит файлы только в текущем экземпляре Excel.
    • Не определяет, открыт ли файл у другого пользователя или на другом ПК.

    Когда использовать:

    • Контроль открытия файлов внутри одного экземпляра Excel.
    • Предотвращение повторного открытия книги.
    • Навигация между уже загруженными файлами.

    Сравнение двух подходов

    Критерий Блокировка файла Коллекция Workbooks
    Типы файлов Любые Только Excel
    Сетевые папки Да Нет
    Скорость Средняя Очень высокая
    Область применения Универсальная Внутри Excel

    Практическая рекомендация

    В реальных проектах для книг Excel часто используют комбинацию двух этих методов:

    1. Сначала проверяют, открыт ли файл в текущем экземпляре Excel.
    2. Затем — не заблокирован ли он на уровне файловой системы.

    Такой подход позволяет добиться максимальной надёжности.

    Заключение

    Проверка, открыт ли файл, — важный элемент автоматизации в Excel. Используя VBA, можно программно контролировать доступ к файлам и избегать критических ошибок.

    • Проверка через блокировку — универсальный и надёжный метод.
    • Проверка через Workbooks — быстрый и безопасный вариант для Excel-файлов.

    Грамотное применение этих сценариев делает VBA-решения стабильными и профессиональными.


    Содержание рубрики VBA Excel по тематическим разделам со ссылками на все статьи.