Как проверить, открыт ли файл, с помощью VBA Excel? Проверка, открыт ли файл, через попытку блокировки и через коллекцию Application.Workbooks.
Введение
При автоматизации в Excel часто возникает необходимость определить, открыт ли файл в данный момент. Это особенно важно при совместной работе с отчётами, сетевыми папками, общими файлами и макросами, выполняемыми по расписанию.
Если не учитывать этот момент, можно столкнуться с ошибками записи, потерей данных или повреждением файлов.
В данной статье рассмотрены два основных сценария проверки, чтобы узнать, открыт ли файл:
- Проверка через попытку открытия и блокировки (для любого файла).
- Проверка через коллекцию Application.Workbooks (для Excel-файла).
Проверка файла через попытку блокировки
Суть метода:
В ОС Windows открытый процесс обычно блокирует файл, не давая другим программам редактировать его и, тем более, удалять. В коде ниже VBA пытается открыть файл в бинарном режиме с одновременной блокировкой на чтение и запись. Если файл уже используется другим процессом (Excel, Word, пользователь в сети и т. д.), Windows не разрешит такую операцию, и VBA вернёт ошибку.
На основе этой ошибки и делается вывод: открыт ли файл или нет.
Особенность блокировки файлов в разных приложениях:
Важно отметить, что не все приложения блокируют файлы при открытии. Например, текстовые редакторы, такие как Блокнот или Notepad++, не ставят блокировку на текстовые файлы. Эти программы просто открывают файл для чтения и редактирования, не запрещая другим процессам доступ к нему.
Аналогичная ситуация наблюдается и с графическими редакторами, которые работают с изображениями: такие программы не блокируют файлы, позволяя другим приложениям или пользователям открывать и изменять их. Проверил эту информацию в редакторах изображений GIMP и Paint, в программах Ножницы и Фотографии — во всех перечисленных приложениях открытый файл не заблокирован.
В отличие от вышеназванных программ, Excel, Word и другие приложения, работающие с данными в таблицах или базах данных, или применяющие сложное форматирование текста, используют блокировку для предотвращения одновременной записи в файл, что позволяет избежать конфликтов данных и ошибок при сохранении изменений.
Если открыть обычный текстовый файл (.txt) с помощью программы Word, то файл будет заблокирован.
Код функции VBA с попыткой блокировки файла:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Function IsFileOpen(FileName As String) As Boolean ' Сначала проверяем, существует ли файл вообще If FileName = "" Or Dir(FileName) = "" Then IsFileOpen = False Exit Function End If Dim fileNum As Integer fileNum = FreeFile ' Получаем свободный номер файла для инструкции Open On Error Resume Next ' Включаем игнорирование ошибок ' Пытаемся открыть файл для чтения-записи и заблокировать ' чтение-запись для других процессов Open FileName For Binary Access Read Write Lock Read Write As #fileNum Close #fileNum IsFileOpen = (Err.number <> 0) On Error GoTo 0 ' Отключаем игнорирование ошибок End Function |
Как работает код:
- Сначала код проверяет, существует ли файл, так как если файл не существует, инструкция Open, используемая в бинарном режиме, создаст текстовый файл с указанным именем.
- VBA пытается открыть файл в бинарном режиме.
- Запрашивается блокировка
Lock Read Write. - Если файл уже открыт другим процессом — возникает ошибка.
- По наличию ошибки определяется результат.
Возвращаемые значения:
True— файл открыт или заблокирован (например, в диалоге «Свойства» файла установлен атрибут «Только чтение»).False— файл закрыт (или открыт, но не заблокирован) и доступен для работы.
Пример использования:
|
1 2 3 4 5 6 7 |
Sub CheckFile1() If IsFileOpen("C:\DATA\Зимняя картинка.doc") Then MsgBox "Файл открыт или заблокирован!" Else MsgBox "Файл закрыт или не заблокирован и доступен для работы." End If End Sub |
Преимущества метода:
- Работает с любыми типами файлов (Excel, Word, PDF и др.).
- Подходит для сетевых папок.
- Не требует использования Windows API.
- Надёжен в корпоративной среде.
Недостатки метода:
- Не все программы блокируют открытые ими файлы (впрочем, вряд ли это помешает работать с таким файлом).
- Может вернуть ложный результат при отсутствии прав доступа.
Когда использовать:
- Автоматическая запись отчётов.
- Проверка доступности файлов.
- Работа с сетевыми ресурсами.
Проверка книги через коллекцию Workbooks
Суть метода:
Excel хранит список всех открытых книг в коллекции Application.Workbooks. Если нужный файл присутствует в этой коллекции — значит, он открыт в текущем экземпляре Excel.
Если у пользователя запущено два отдельных окна Excel (два процесса excel.exe), этот метод не увидит файл, открытый во втором окне. В этом случае поможет только первый метод (Функция IsFileOpen).
Код функции VBA с перебором открытых книг Excel:
|
1 2 3 4 5 6 7 8 9 10 |
Function IsWorkbookOpen(FileName As String) As Boolean Dim wb As Workbook For Each wb In Application.Workbooks If LCase(wb.FullName) = LCase(FileName) Then IsWorkbookOpen = True Exit Function End If Next wb IsWorkbookOpen = False End Function |
Как работает код:
- VBA перебирает все открытые книги Excel.
- Сравнивает полный путь файла.
- Если совпадение найдено — файл открыт.
Стоит отметить, что в этой функции можно использовать не полный путь файла, а только имя книги. Для этого надо wb.FullName в четвёртой строке заменить на wb.Name.
Возвращаемые значения:
True— файл открыт в текущем экземпляре Excel.False— файл не открыт в текущем экземпляре.
Пример использования:
|
1 2 3 4 5 6 7 |
Sub CheckFile2() If IsWorkbookOpen("C:\Users\user\Desktop\Книга2.xlsm") Then MsgBox "Файл открыт!" Else MsgBox "Файл закрыт!" End If End Sub |
Преимущества метода:
- Очень высокая скорость работы.
- Отсутствие ошибок и блокировок.
- Безопасен для данных.
- Идеален для логики внутри одного экземпляра Excel.
Недостатки метода:
- Работает только с Excel-файлами.
- Видит файлы только в текущем экземпляре Excel.
- Не определяет, открыт ли файл у другого пользователя или на другом ПК.
Когда использовать:
- Контроль открытия файлов внутри одного экземпляра Excel.
- Предотвращение повторного открытия книги.
- Навигация между уже загруженными файлами.
Сравнение двух подходов
| Критерий | Блокировка файла | Коллекция Workbooks |
|---|---|---|
| Типы файлов | Любые | Только Excel |
| Сетевые папки | Да | Нет |
| Скорость | Средняя | Очень высокая |
| Область применения | Универсальная | Внутри Excel |
Практическая рекомендация
В реальных проектах для книг Excel часто используют комбинацию двух этих методов:
- Сначала проверяют, открыт ли файл в текущем экземпляре Excel.
- Затем — не заблокирован ли он на уровне файловой системы.
Такой подход позволяет добиться максимальной надёжности.
Заключение
Проверка, открыт ли файл, — важный элемент автоматизации в Excel. Используя VBA, можно программно контролировать доступ к файлам и избегать критических ошибок.
- Проверка через блокировку — универсальный и надёжный метод.
- Проверка через
Workbooks— быстрый и безопасный вариант для Excel-файлов.
Грамотное применение этих сценариев делает VBA-решения стабильными и профессиональными.