Хитрости »
Основные понятия (21)Здесь собраны статьи, в которых разъясняются базовые понятия работы в Excel и VBA, а так же проблемы, с которыми сталкивается большинство начинающих
Сводные таблицы и анализ данных (4) Раздел поможет изучить сводные таблицы и научиться их использовать "на полную"
Графики и диаграммы (4) Раздел поможет научиться создавать диаграммы и графики в Excel, в том числе нестандартные
Работа с VB проектом (9) С помощью статей раздела вы научитесь создавать процедуры программно и выполнять различные операции с объектами самого VBA
Условное форматирование (5) Этот раздел поможет поближе познакомиться с Условным форматированием на примерах различных ситуаций
Списки и диапазоны (5) Статьи, посвященные работе не только с выпадающими списками, но и с диапазонами и хитростями их применения в рабочих файлах
Макросы(VBA процедуры) (56) Статьи раздела направлены на изучение VBA с детальным разбором кодов. Множество статей с примерами кодов под всевозможные ситуации с комментариями и пояснениями
Разное (33) Собраны статьи, которые не подходят ни под одну из представленных выше категорий или входят сразу в несколько. Но эти статье не менее полезные!

Как проверить открыта ли книга?

Собственно суть темы отражена в названии. Как при выполнении кода из VBA узнать перед обращением к книге открыта она или нет? Ведь если книга закрыта, то обращение к ней вызовет ошибку, а если открывать без проверки - то это может повлечь за собой утерю данных, если предварительно эта книга не была сохранена. Ни один ни второй вариант, естественно, не устраивают. Я покажу два способа проверки через функции. Если функция вернет True - книга открыта, если False - закрыта. Для проверки функций используем проверочную процедуру Check_Open_Book:

Данная процедура вызывает функцию IsBookOpen, передавая ей в качестве параметра имя книги, "открытость" которой мы хотим проверить. Я приведу несколько вариантов самой функции IsBookOpen. Во всех вариантах действует один и тот же принцип: код любого из вариантов функции IsBookOpen необходимо скопировать и вставить в стандартный модуль. Модуль должен быть внутри той книги, в кодах которой планируется проверять открыта ли книга. Только тогда IsBookOpen будет доступна для вызова из любого кода этой же книги.
Если вдруг в момент выполнения на строке If IsBookOpen("Книга1.xls") Then появится ошибка "Sub or function not defined" - значит функция IsBookOpen либо не была скопирована в стандартный модуль, либо она вообще не в стандартном модуле, а в модуле листа, формы или книги.


Вариант 1:

Функция просматривает все открытые книги и если находит среди них книгу с указанным именем, то функция возвращает True. Есть небольшая особенность - функция исключает скрытые книги(это либо надстройки, либо PERSONAL.XLS). Так же из просмотра исключена та книга, в которой расположен сам код. Если Вам нужно проверить наличие книги независимо от её видимости, то необходимо просто заменить блок

на одну строку(просто убрать лишнее условие проверки)


Либо можно использовать Вариант 2:

Данный способ обращается к любой открытой книге, даже если она скрыта как PERSONAL.XLS или надстройка. Однако у данной функции есть недостаток - используется оператор On Error и если в настройках VBA(Tools -Options -вкладка General) установлено Break on All Errors - то этот код не сработает, если книга не открыта - получим ошибку. В то время как Вариант1 с циклом по всем открытым книгам сработает без ошибок.


Вариант 3:
По просьбам читателей решил добавить код, который проверяет открыта ли книга независимо от её месторасположения и используемого приложения Excel. Книга может быть открыта другим пользователем (если книга на сервере), в другом экземпляре Excel или в этом же экземпляре Excel.

Функция несколько отличается от приведенных выше - передается в неё не только имя книги, а полный путь к книге, включая имя и расширение:

Также см.:
Как узнать существует ли лист в книге?
Как узнать существует ли модуль в книге


Статья помогла? Сделай твит, поделись ссылкой с друзьями!

Поиск по меткам

Access Multex Outlook VBA работа в редакторе VBA управление кодами Бесплатные надстройки Дата и время Диаграммы и графики Записки Защита данных Интернет Картинки и объекты Листы и книги Макросы и VBA Настройка Поиск данных Почта Программы Работа с приложениями Работа с файлами Разработка приложений Сводные таблицы Списки Тренинги и вебинары Финансовые Форматирование Формулы и функции Функции Excel Функции VBA Ячейки и диапазоны вебинар ссылки тренинг
Обсуждение: оставлено 11 коммент.
  1. Alexei:

    А как проверить открыта ли книга, если книга находится на сервере и при этом открыта не мной?

  2. Anatoly:

    Alexei :
    А как проверить открыта ли книга, если книга находится на сервере и при этом открыта не мной?

    поддерживаю вопрос! Даже если книга открыта вторым Экселем на моем же ПК, то проверить открыта ли она нет возможности .....

  3. Alexei, Anatoly - добавил код, который проверяет независимо ни от чего.

  4. san-andrew:

    @Дмитрий(Админ)
    При открытом Workbooks.Open FileName:="C:\Книга1.xls", ReadOnly:=True - в первом экземпляре Excel и запуска 3-его варината Function IsBookOpen - из второго экземпляра Excel, Function IsBookOpen возвращает False ибо файл "C:\Книга1.xls" открыт в режиме ReadOnly.
    Аналогичный результат при работе в одном эксземпляре Excelя.
    Полагаю надо добавить комент к третьему варианту с его ограничением и переобозвать функцию CheckBookWriteOpen

  5. san-andrew, сначала прочитайте начало статьи. Цель - перед открытием узнать, если ли право вносить изменения или открыть не испортив данные имеющиеся. И Ваш комментарий никак этого не отрицает, а подтверждает. Если книга открыта в режиме чтения - то её можно открыть в обычном режиме и вносить в неё изменения и никаких конфликтов не возникнет. Так что добавлять какие-то комментарии не имеет смысла, т.к. по факту в режиме чтения открыта не книга, а её временный экземпляр, который не может внести изменения в сам исходный файл.

  6. Александр:

    @Дмитрий(Админ)
    Добрый день, Дмитрий!
    Спасибо за код. Отлично работает.
    Не могли бы Вы подсказать как по известному из Вашего кода пути обратиться к книге и сделать ее активной, если она открыта во втором экземпляре Excel?

  7. George:

    Возможно я слоупок, что пишу только сейчас, но 3-й вариант в 2010 Excel выдаёт True, если книга на сетевой шаре открыта другим пользователем.

    • George, а какой должен быть по-Вашему результат? Ведь даже аннотация к третему варианту такая:
      "По просьбам читателей решил добавить код, который проверяет открыта ли книга независимо от её месторасположения и используемого приложения Excel. Книга может быть открыта другим пользователем (если книга на сервере), в другом экземпляре Excel или в этом же экземпляре Excel."
      т.е. изначально этот вариант определяем открыта ли книга вообще кем-либо где-либо.

      • George:

        Вот это скорость ответа! :)
        В моём случае, нужно было проверить открыта ли сетевая книга на локальном компьютере. Соответственно, результат функции меня и удивил)) По моей логике, при открытии книги "для чтения", нам не важно открыл ли её кто-то другой или нет. Но даже если посмотреть со стороны открытия сетевого файла для записи, функция всё равно не даст чёткого ответа, на локальном компьютере открыта книга или кем-то другим, поэтому мне и не понятно, для чего возвращать True, если потом всё равно не будет уверенности открывать книгу или просто делать активной.

        Свою проблему решил другим решением, а именно проверкой по полному пути (может кому пригодится):

        Function isWorkbookOpenByFullPath(FullPath As String) As Boolean
        Dim WB As Workbook
        isWorkbookOpenByFullPath = False

        For Each WB In Application.Workbooks
        If WB.FullName = FullPath Then
        isWorkbookOpenByFullPath = True
        Exit For
        End If
        Next
        End Function

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

Тренинги

Необходимо автоматизировать процессы в MS Office?
Доверьте это профессионалам и работа всегда будет сделана качественно и в срок!Заказать

Логин
Счетчики
Анализ сайта

Яндекс.Метрика
© 2016 Excel для всех  Войти