Detect whether Excel workbook is already open [closed]
Want to improve this question? Update the question so it focuses on one problem only by editing this post.
Closed 8 years ago .
In VBA, I opened an MS Excel file named «myWork.XL» programmatically.
Now I would like a code that can tell me about its status — whether it is open or not. I.e. something like IsWorkBookOpened(«myWork.XL) ?
7 Answers 7
![]()
![]()
For my applications, I generally want to work with a workbook rather than just determine if it’s open. For that case, I prefer to skip the Boolean function and just return the workbook.
If its open it will be in the Workbooks collection:
I would go with this:
as sFileName you have to provide direct path to the file for example:
What if you want to check without creating another Excel instance?
For example, I have a Word macro (which is run repeatedly) that needs to extract data from an Excel spreadsheet. If the spreadsheet is already open in an existing Excel instance, I would prefer not to create a new instance.
Как определить открыта ли книга Excel
Что делает макрос: При автоматическом открытии книги, необходимо учитывать, что может произойти при попытке открытия книги, которая уже открыта. Обычно Excel пытается открыть файл еще раз, с предупреждением, что любые несохраненные изменения будут потеряны. В VBA есть хороший инструмент, которые знает, как определить открыта ли книга, прежде чем пытаться открыть его снова.
Как макрос работает
Первое, что надо заметить, что это функция, а не процедура Sub. Мы проверяем файл, чтобы увидеть, назначен ли он переменной объекта. Только открытые книги могут быть присвоены переменной объекта. Когда мы пытаемся назначить закрытую книгу для переменной, возникает ошибка. Так что, если данная книга может быть назначена, книга открыта, если возникает ошибка, книга закрыта.
Код макроса
Как работает этот код
- Первое, что макрос делает – указывает переменную строку, содержащую имя файла, который выбирает пользователь. TestBook это имя переменной строки.
- В шаге 2, мы проверяем Excel на ошибки. В случае ошибки, возобновить код. Без этой строки код остановится при возникновении ошибки. Опять же, мы проводим тестирование данного файла, чтобы увидеть, назначен ли он переменной объекта. Поэтому, если данная книга может быть назначена, она открыта, если возникает ошибка, она закрыта. Если возникла ошибка, нам нужно знать код.
- На шаге 3, присваиваем книге переменную объекта TestBook. Сама строка переменной называется TargetWorkbook. TargetWorkbook передает функции в объявлении функции (см. первую строку кода). Данная функция устраняет необходимость жесткого кодирования имени книги, что позволяет нам передать его в качестве переменной.
- На шаге 4, проверяем, произошла ли ошибка. Если ошибки не произошло, книга открыта, поэтому мы устанавливаем FileIsOpenTest в True. Если произошла ошибка, это означает, что книга не открыта. В этом случае мы устанавливаем FileIsOpenTest значение false.
Это функция может быть использована для оценки любого файла, который передаст к нему, через его TargetWorkbook аргумент. Мы будем использовать затем эту функцию в макросе. Следующий макрос показывает, как реализовать эту функцию. Здесь мы используем одни и те же макросы, которые вы видели в предыдущем разделе, «Как открыть конкретную книгу, определенную пользователем», но на этот раз, мы создаем новую функцию FileIsOpenTest, чтобы убедиться, что пользователь не может открыть уже открытый файл.
Код макроса
Как использовать
Чтобы реализовать этот макрос, вы можете скопировать и вставить в обе части кода в стандартном модуле:
VBA Excel. Открыта или закрыта книга (проверка состояния)
Способ проверки по краткому имени, открыта ли рабочая книга, позволяет определить состояние проверяемой книги в том же экземпляре приложения Excel, в котором открыта книга с проверяющим кодом.
Использование объектной переменной
Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.
- wbName – краткое имя проверяемой рабочей книги.
Перебор открытых книг циклом
Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.
В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.
Проверка по полному имени
Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.
- wbFullName – полное имя проверяемой рабочей книги.
Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).
Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number <> 0) возвратит значение True.
Примеры проверки состояния книги
По краткому имени
По полному имени
6 комментариев для “VBA Excel. Открыта или закрыта книга (проверка состояния)”
Большое спасибо за подробную информацию
Примеры проверки состояния книги
По краткому имени
Сначала вставляем функцию, потом код в макрос.
все работает
Добрый день!
При вставке данной функции появляется ошибка «Sub or function not defined». Что это значит и как ее исправить?
Здравствуйте, Анна!
Такая ошибка может произойти, когда имя функции в вызывающей ее процедуре записано с ошибкой. Также, обратите внимание, что функция BookOpenClosed должна быть с таким именем одна в модуле.
Добрый день!
А если есть две формы, для каждой своя кнопка для UserForm.Show.
В первой есть
Public wb_targ As Workbook
а далее всё определяется для открываемого файла и выполняется
Set wb_targ = Workbooks(TargetFileName)
Первая форма закрывается, работаем во второй. Это в норме. Но если вызвать сразу вторую форму (т.е. не будет открытого Workbooks(TargetFileName)) , то как во второй форме проверить наличие открытой книги, ведь я не знаю заранее её имя.
(можно, наверное, TargetFileName сделать глобальной и её смотреть во второй форме. Но тема Вашего урока "Книга (проверка состояния)". Хочется решить "по теме", с неизвестным именем).
Перепробовал, кажется, всё по типу If wb_targ.FullName = «»
Не прокатило… обломался (:
пришлось прятать вторую кнопку, пока по первой не пройдутся.
Спасибо.
Здравствуйте, Алик!
Проверить состояние книги с неизвестным именем не получится.
Проверка, открыта ли книга Excel
Есть ли способ увидеть, что книга Excel, например DataSheet.xls, открыта (используется) или нет? Я хотел бы закрыть эту Рабочую книгу, если она открыта.
6 ответов
Правильный способ — изучить объект Application.Workbooks. В VBA вы должны написать:
Другими словами, Workbooks — это массив (или в VBA, сборник) всех открытых книг.
В С# работает следующий код:
Вы, вероятно, захотите передать ссылку на Excel.Application самостоятельно.
Это попытается открыть файл исключительно. Если файл уже открыт, он выдает исключение, где вы можете (попытаться) закрыть его и продолжить.
Для всех, кто интересуется одним лайнером, который избегает использования try-catch.
Или с полными именами.
Конечно, вы можете немного разбить это. Главное — использовать LINQ вместо try-catch для проверки существования книги.
Примечание 1: Marshal.GetActiveObject(«Excel.Application») выдаст ошибку, если экземпляр Excel не открыт. Поэтому, если иное не гарантировано или не разрешено, это всегда должно быть в попытке.
Примечание 2: Marshal.GetActiveObject(«Excel.Application») возвращает только один экземпляр Excel. Если вам нужно искать любой возможный экземпляр Excel, тогда приведенный ниже код может быть лучшей альтернативой.
Лучшая альтернатива
Если вы не возражаете добавить класс-помощник, приведенный ниже код может стать лучшей альтернативой. Помимо возможности поиска любого открытого экземпляра Excel, он также позволяет вам проверять полный путь и возвращать фактический объект рабочей книги, если он найден. Он также избегает бросать ошибку, если не открывается экземпляр Excel.
использование будет таким.
Я адаптировал метод GetRunningObjects() в приведенном выше коде из здесь.