Vba excel открыть книгу если открыта

Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.

Проверка по краткому имени

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

Использование объектной переменной

Вариант пользовательской функция VBA Excel, предназначенной для проверки, открыта или закрыта рабочая книга, путем определения результата присвоения ссылки на нее объектной переменной. Присвоение состоялось (BookOpenClosed = True) – книга открыта, произошла ошибка и присвоение не состоялось (BookOpenClosed = False) – книга закрыта.

Function BookOpenClosed(wbName As String) As Boolean

    Dim myBook As Workbook

    On Error Resume Next

        Set myBook = Workbooks(wbName)

    BookOpenClosed = Not myBook Is Nothing

End Function

Аргумент функции:

  • wbName – краткое имя проверяемой рабочей книги.

Перебор открытых книг циклом

Этот вариант функции BookOpenClosed перебирает с помощью цикла все открытые книги Excel и проверяет их краткие имена на совпадение с кратким именем проверяемой книги. Совпадение найдено (BookOpenClosed = True) – книга открыта, совпадение не найдено (BookOpenClosed = False) – книга закрыта.

Function BookOpenClosed(wbName As String) As Boolean

    Dim myBook As Workbook

    For Each myBook In Workbooks

        If myBook.Name = wbName Then

            BookOpenClosed = True

            Exit For

        End If

    Next

End Function

В коллекцию Workbooks входят и скрытые книги, в том числе Личная книга макросов, и книга с функцией.

Проверка по полному имени

Проверка по полному имени с помощью оператора Open позволяет узнать, открыта ли рабочая книга каким-либо другим процессом: текущим экземпляром Excel, в котором открыта книга с проверяющим кодом, другим экземпляром Excel или сторонним приложением.

Function BookOpenClosed(wbFullName As String) As Boolean

    Dim ff As Integer

    ff = FreeFile

        On Error Resume Next

        Open wbFullName For Random Access Read Write Lock Read Write As #ff

        Close #ff

    BookOpenClosed = (Err.Number <> 0)

End Function

Аргумент функции:

  • wbFullName – полное имя проверяемой рабочей книги.

Эта функция открывает с помощью оператора Open файл проверяемой книги с разрешением чтения и записи (параметр access) и запретом чтения и записи, если этот файл уже открыт другим процессом (параметр lock).

Если файл уже открыт другим процессом, а указанный тип доступа (параметр access) не разрешен (параметр lock), операция открытия завершится с ошибкой, а выражение (Err.Number <> 0) возвратит значение True.

Примеры проверки состояния книги

По краткому имени

Sub Primer1()

    If BookOpenClosed(«Книга1.xlsx») Then

        MsgBox «Книга открыта»

    Else

        MsgBox «Книга закрыта»

    End If

End Sub

По полному имени

Sub Primer2()

    If BookOpenClosed(«C:Папка1Папка2Папка3Книга1.xlsx») Then

        MsgBox «Книга открыта»

    Else

        MsgBox «Книга закрыта»

    End If

End Sub


Хитрости »

4 Май 2011              93409 просмотров


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

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

Sub Check_Open_Book()
    If IsBookOpen("Книга1.xls") Then
        MsgBox "Книга открыта", vbInformation, "Сообщение"
    Else
        MsgBox "Книга закрыта", vbInformation, "Сообщение"
        'открываем книгу
        Workbooks.Open "C:Книга1.xls"
    End If
End Sub

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


Вариант 1:

Function IsBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook
    For Each wbBook In Workbooks
        If wbBook.Name <> ThisWorkbook.Name Then
            If Windows(wbBook.Name).Visible Then
                If wbBook.Name = wbName Then IsBookOpen = True: Exit For
            End If
        End If
    Next wbBook
End Function

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

    If Windows(wbBook.Name).Visible Then
        If wbBook.Name = wbName Then IsBookOpen = True: Exit For
    End If

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

    If wbBook.Name = wbName Then IsBookOpen = True: Exit For

Либо можно использовать

Вариант 2:

Function IsBookOpen(wbName As String) As Boolean
    Dim wbBook As Workbook: On Error Resume Next
    Set wbBook = Workbooks(wbName)
    IsBookOpen = Not wbBook Is Nothing
End Function

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


Вариант 3:

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

Function IsBookOpen(wbFullName As String) As Boolean
    Dim iFF As Integer, retval As Boolean
    iFF = FreeFile
    On Error Resume Next
    Open wbFullName For Random Access Read Write Lock Read Write As #iFF
    retval = (Err.Number <> 0)
    Close #iFF
    IsBookOpen = retval
End Function

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

Sub Test()
    MsgBox "Файл 'Книга1'" & IIf(IsBookOpen("C:Книга1.xls"), " уже открыт", " не занят")
End Sub

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

Sub Test()
    Dim sWBFullName As String
    Dim wb As Workbook
    'полный путь к проверяемой книге
    sWBFullName = "C:DocumentsКнига1.xls"
    'если книга кем-то открыта - пропускаем обработку этой книги
    'книга закрыта - вносим изменения, сохраняем, закрываем
    If IsBookOpen(sWBFullName) = False Then
        Set wb = Application.Workbooks.Open(sWBFullName)
        'изменяем значение ячейки "A1" на первом листе книги
        wb.Sheets(1).Range("A1").Value = "www.excel-vba.ru"
        ws.Close True
    End If
End Sub

При использовании функции IsBookOpen так же надо учитывать, что она может посчитать книгу открытой не только если она реально кем-то открыта, а если к ней просто нет доступа(например, заблокирован доступ со стороны администратора и т.п.).

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


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

  Плейлист   Видеоуроки


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



Access
apple watch
Multex
Power Query и Power BI
VBA управление кодами
Бесплатные надстройки
Дата и время
Записки
ИП
Надстройки
Печать
Политика Конфиденциальности
Почта
Программы
Работа с приложениями
Разработка приложений
Росстат
Тренинги и вебинары
Финансовые
Форматирование
Функции Excel
акции MulTEx
ссылки
статистика

 

andronus

Пользователь

Сообщений: 147
Регистрация: 06.06.2017

#1

27.02.2019 17:31:26

Здравствуйте.

Есть код макроса (пусть будет называться <MACROS>), который переключается между двумя открытыми книгами (пусть будут <BOOK1> и <BOOK2>) и тянет из них данные. Для того, чтоб пользователь не забывал открыть эти книги, нужно их принудительно открывать, если они закрыты. Подсмотрел

тут

код:

Код
If WorkBookIsOpen("имя_проверяемой_книги") Then    
Workbooks("имя_проверяемой_книги").Activate   
Else   
Workbooks.Open("путь к нужной книге")   
End if

Подскажите плиз, каким будет правильный код в моём случае? То есть, код должен проверять, открыты ли <BOOK1> и <BOOK2> и:
1. Если открыты, то запускать код <MACROS>
2. Если закрыты, то открывать их и запускать код <MACROS>

Я вижу это так (ниже), но не знаю, как правильно написать проверку двух книг, и плюс имеется проблема, заключающаяся в том, что код <MACROS> объёмен, и два раза его писать — это непорядок:

Код
If WorkBookIsOpen("<BOOK1>") И WorkBookIsOpen("<BOOK2>") Then
'<MACROS>
Else
Workbooks.Open("путь к <BOOK1>") И Workbooks.Open("путь к <BOOK2>")
'<MACROS>
End If
 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#2

27.02.2019 17:42:42

я для этого использую след. функцию

Код
'******************************************************************************
' Получаем Книгу, если она УЖЕ открыта или Nothing
'
Function FindWorkBook(wbNameMask As String) As Workbook
  Dim wb As Workbook
  For Each wb In Workbooks
    If wb.Name Like wbNameMask Then Set FindWorkBook = wb: Exit Function
  Next
End Function

поможет-ли это Вам — не знаю

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Alex_I_S

Пользователь

Сообщений: 29
Регистрация: 25.12.2018

Можно исключить человеческий фактор. Пусть макрос открывает книги, берет из них данные и закрывает. И пользователю меньше заморочек.

 

andronus

Пользователь

Сообщений: 147
Регистрация: 06.06.2017

#4

27.02.2019 18:38:38

Цитата
Ігор Гончаренко написал:
поможет-ли это Вам — не знаю

А без функции, стандартным кодом саба, нельзя никак?

Цитата
Alex_I_S написал:
Можно исключить человеческий фактор. Пусть макрос открывает книги, берет из них данные и закрывает. И пользователю меньше заморочек.

Проблема в том, что они уже могут быть открыты. В таком случае эксель диалоговым окном предлагает переоткрыть.

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#5

27.02.2019 18:46:35

Цитата
andronus написал:
Проблема в том, что они уже могут быть открыты. В таком случае эксель диалоговым окном предлагает переоткрыть

Скажите Excel, что не нужно показывать этот диалог:  Application.DisplayAlerts = False
Только не забудьте перед выходом из процедуры включить обратно.

 

andronus

Пользователь

Сообщений: 147
Регистрация: 06.06.2017

#6

27.02.2019 18:52:57

Думал об этом, но тогда файл просто переоткрывается. Это не подходит, т.к. файл мог быть не сохранен, и тогда откроется неактуальная версия.

Нашел на просторах инета следующий код, он работает:

Код
Dim iStatus As Long
Err.Clear
On Error Resume Next
Set wb = Workbooks("C:123.xlsx")
iStatus = Err
On Error Goto 0
If iStatus Then 'workbook isn't open
   Workbooks.Open ("C:123.xlsx")
Else
   'workbook is open
   wb.Activate
End If

За исключением того, что в случае если файл «C:123.xlsx» открыт, эксель пытается его заново открыть. Как объяснить ему, что файл уже открыт, и ничего в этом случае делать не надо? И как добавить в код не один, а два файла?

Изменено: andronus27.02.2019 22:44:49

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#8

27.02.2019 19:21:23

Цитата
andronus написал:
1. Проблема в том, что они уже могут быть открыты
2. А без функции, стандартным кодом саба, нельзя никак?

1. а функции по-барабану открыта книга или закрыта
— открыта — получите ссылку на книгу
— закрыта — получите Nothing (и откроете самостоятельно)
2. можно, но нецелесообразно. тут Вы полностью оправдали мои предположения и, вообще-то, код саба ничем не стандартнее кода функции.
удачи!

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

andronus

Пользователь

Сообщений: 147
Регистрация: 06.06.2017

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

 

Юрий М

Модератор

Сообщений: 60575
Регистрация: 14.09.2012

Контакты см. в профиле

#10

27.02.2019 19:29:57

Цитата
andronus написал:
я не вижу, куда вставлять название книги

по моей ссылке ведь есть пример вызова функции. Прокрутите немного вниз

Код
Пример вызова любой из вышеопубликованных авторских функций :
Private Sub Test() 
    MsgBox WorkbookIsOpen("Имя_Книги.xls") 
End Sub
 

andronus

Пользователь

Сообщений: 147
Регистрация: 06.06.2017

#11

28.02.2019 15:13:25

Решение найдено. Следующий кусок кода проверяет, открыта ли необходимая книга или нет.
Если открыта, то выполняет основной код макроса.
Если закрыта, то открывает ее и затем выполняет основной код макроса.

Код
Dim wb As Workbook
Dim myWorkBook As String

myWorkBook = "ИМЯ.xlsx"
For Each wb In Application.Workbooks
    If wb.Name = myWorkBook Then
        GoTo maincode
        End
    End If
Next
If ActiveWorkbook.Name <> myWorkBook Then
Workbooks.Open ("ПУТЬ:ИМЯ.xlsx")
End If

'основной код макроса
maincode:

Изменено: andronus28.02.2019 18:59:25

Содержание

  1. Открытие / закрытие книги VBA
  2. Откройте книгу в VBA
  3. Открыть книгу из пути
  4. Открыть книгу — ActiveWorkbook
  5. Откройте книгу и назначьте переменной
  6. Диалог открытия файла книги
  7. Открыть новую книгу
  8. Открыть новую книгу в переменной
  9. Синтаксис открытой книги
  10. Открыть книгу только для чтения
  11. Открыть книгу, защищенную паролем
  12. Примечания к синтаксису Open Workbook
  13. Закройте книгу в VBA
  14. Закрыть конкретную книгу
  15. Закрыть активную книгу
  16. Закройте все открытые книги
  17. Закрыть первую открытую книгу
  18. Закрыть без сохранения
  19. Сохранить и закрыть без запроса
  20. Другие примеры открытых книг
  21. Открыть несколько новых книг
  22. Открыть все книги Excel в папке
  23. Проверьте, открыта ли рабочая книга
  24. Workbook_Open Событие
  25. VBA Excel. Открыта или закрыта книга (проверка состояния)
  26. Проверка по краткому имени
  27. Использование объектной переменной
  28. Перебор открытых книг циклом
  29. Проверка по полному имени
  30. Примеры проверки состояния книги
  31. По краткому имени
  32. По полному имени
  33. 6 комментариев для “VBA Excel. Открыта или закрыта книга (проверка состояния)”
  34. Свойства и методы ActiveWorkbook
  35. Краткое руководство по книге VBA
  36. Начало работы с книгой VBA
  37. Доступ к рабочей книге VBA по индексу
  38. Поиск всех открытых рабочих книг
  39. Открыть рабочую книгу
  40. Проверить открыта ли книга
  41. Закрыть книгу
  42. Сохранить книгу
  43. Копировать книгу
  44. Использование диалогового окна «Файл» для открытия рабочей книги
  45. Использование ThisWorkbook
  46. Использование ActiveWorkbook
  47. Примеры доступа к книге
  48. Объявление переменной VBA Workbook
  49. Создать новую книгу
  50. With и Workbook
  51. Резюме
  52. Заключение

Открытие / закрытие книги VBA

В этом руководстве вы узнаете, как использовать VBA для открытия и закрытия книги Excel несколькими способами.

VBA позволяет открывать или закрывать файлы стандартными методами. .Открытым а также .Закрывать.

Если вы хотите узнать, как проверить, существует ли файл, прежде чем пытаться открыть файл, вы можете щелкнуть по этой ссылке: VBA File Exists

Откройте книгу в VBA

Открыть книгу из пути

Если вы знаете, какой файл хотите открыть, вы можете указать его полный путь в функции. Вот код:

1 Рабочие книги. Откройте «C: VBA Folder Sample file 1.xlsx»

Эта строка кода открывает файл «Образец файла 1» из «Папки VBA».

Открыть книгу — ActiveWorkbook

Когда вы открываете книгу, она автоматически становится ActiveWorkbook. Вы можете ссылаться на недавно открытую книгу следующим образом:

Когда вы ссылаетесь на лист или диапазон и опускаете имя книги, VBA предполагает, что вы имеете в виду ActiveWorkbook:

1 Таблицы («Sheet1»). Name = «Input»

Откройте книгу и назначьте переменной

Вы также можете открыть книгу и назначить ее непосредственно объектной переменной. Эта процедура откроет книгу для wb переменную, а затем сохраните книгу.

123456 Подложка OpenWorkbookToVariable ()Dim wb As WorkbookУстановите wb = Workbooks.Open («C: VBA Folder Sample file 1.xlsx»)wb.SaveКонец подписки

Назначение книг переменным при их открытии — лучший способ отслеживать ваши книги

Диалог открытия файла книги

Вы также можете вызвать диалоговое окно открытия файла книги. Это позволяет пользователю перейти к файлу и открыть его:

12345678 Подложка OpenWorkbook ()Dim strFile As StringstrFile = Application.GetOpenFilename ()Workbooks.Open (strFile)Конец подписки

Как вы можете видеть на изображении 1, при таком подходе пользователи могут выбирать, какой файл открыть. Диалоговое окно «Открыть файл» можно сильно настроить. Вы можете по умолчанию выбрать определенную папку, выбрать, какие типы файлов будут отображаться (например, только xlsx) и многое другое. Прочтите наше руководство по диалоговому окну «Открыть файл» для получения подробных примеров.

Открыть новую книгу

Эта строка кода откроет новую книгу:

1 Рабочие тетради. Добавить

Открыть новую книгу в переменной

Эта процедура откроет новую книгу, присвоив ее переменной wb:

1234 Sub OpenNewWorkbook ()Dim wb As WorkbookУстановите wb = Workbooks.Add.Конец подписки

Синтаксис открытой книги

Когда вы используете Workbooks.Open, вы можете заметить, что при открытии книги доступно множество опций:

Требуется имя файла. Все остальные аргументы необязательны — и вам, вероятно, не нужно знать большинство других аргументов. Вот два наиболее распространенных:

Открыть книгу только для чтения

Когда книга открыта только для чтения, вы не можете сохранить исходный файл. Это предотвращает редактирование файла пользователем.

1 Книги. Откройте «C: VBA Folder Sample file 1.xlsx»,, True

Открыть книгу, защищенную паролем

Книга может быть защищена паролем. Используйте этот код, чтобы открыть книгу, защищенную паролем:

1 Рабочие книги. Откройте «C: VBA Folder Sample file 1.xlsx». «пароль»

Примечания к синтаксису Open Workbook

Обратите внимание, что на изображении выше мы включили круглую скобку «(», чтобы показать синтаксис. Если вы используете круглые скобки при работе с Workbooks.Open, вы должны назначить книгу переменной:

1234 Sub OpenWB ()Dim wb As WorkbookУстановите wb = Workbooks.Open («C: VBA Folder Sample file 1.xlsx», True, True)Конец подписки

Закройте книгу в VBA

Закрыть конкретную книгу

Как и при открытии книги, есть несколько способов закрыть файл. Если вы знаете, какой файл хотите закрыть, вы можете использовать следующий код:

1 Workbooks.Close («C: VBA Folder Sample file 1.xlsx»)

Эта строка кода закрывает файл «Образец файла 1», если он открыт. В противном случае он вернет ошибку, поэтому вам следует позаботиться об обработке ошибок.

Закрыть активную книгу

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

Закройте все открытые книги

Чтобы закрыть все открытые книги, вы можете просто использовать этот код:

Закрыть первую открытую книгу

Это закроет первую открытую / созданную книгу:

1 Рабочие тетради (1) .Закрыть

Замените 1 на 2, чтобы закрыть вторую открытую / созданную книгу и так далее.

Закрыть без сохранения

Это закроет книгу без сохранения и без отображения запроса на сохранение:

1 ActiveWorkbook.Close savechanges: = False

Сохранить и закрыть без запроса

Точно так же это сохранит и закроет книгу без отображения запроса на сохранение:

1 ActiveWorkbook.Close savechanges: = True

Примечание: Есть несколько других способов указать, сохранять или не сохранять рабочую книгу, а также показывать подсказки или нет. Более подробно это обсуждается здесь.

Другие примеры открытых книг

Открыть несколько новых книг

Эта процедура откроет несколько новых книг, назначив новые книги массиву:

12345678 Sub OpenMultipleNewWorkbooks ()Dim arrWb (3) Как рабочая тетрадьDim i как целое числоДля i = от 1 до 3Установите arrWb (i) = Workbooks.AddДалее яКонец подписки

Открыть все книги Excel в папке

Эта процедура откроет все книги Excel в папке с помощью средства выбора диалогового окна «Открыть файл».

12345678910111213141516 Sub OpenMultipleWorkbooksInFolder ()Dim wb As WorkbookDim dlgFD как FileDialogDim strFolder как строкаDim strFileName As StringУстановите dlgFD = Application.FileDialog (msoFileDialogFolderPicker)Если dlgFD.Show = -1 ТогдаstrFolder = dlgFD.SelectedItems (1) и Application.PathSeparatorstrFileName = Dir (strFolder & «* .xls *»)Сделать пока strFileName «»Установите wb = Workbooks.Open (strFolder & strFileName)strFileName = DirПетляКонец, еслиКонец подписки

Проверьте, открыта ли рабочая книга

Эта процедура проверяет, открыта ли книга:

1234567891011 Sub TestByWorkbookName ()Dim wb As WorkbookДля каждого ББ в книгахЕсли wb.Name = «New Microsoft Excel Worksheet.xls», тоMsgBox «Нашел»Код вызова Exit Sub ‘здесь, мы просто выйдем сейчасКонец, еслиСледующийКонец подписки

Workbook_Open Событие

События VBA — это «триггеры», которые говорят VBA выполнить определенный код. Вы можете настроить события книги для открытия, закрытия, до сохранения, после сохранения и т. Д.

Прочтите наше руководство по событию Workbook_Open, чтобы узнать больше об автоматическом запуске макросов при открытии книги.

Источник

VBA Excel. Открыта или закрыта книга (проверка состояния)

Открыта или закрыта книга Excel? Проверяем с помощью кода VBA по краткому или полному имени файла, используя объектную переменную, цикл или оператор Open.

Проверка по краткому имени

Способ проверки по краткому имени, открыта ли рабочая книга, позволяет определить состояние проверяемой книги в том же экземпляре приложения 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 должна быть с таким именем одна в модуле.

Источник

Свойства и методы ActiveWorkbook

Мы тонем в информации, но жаждем знаний

Эта статья содержит полное руководство по использованию рабочей книги VBA.

Если вы хотите использовать VBA для открытия рабочей книги, тогда откройте «Открыть рабочую книгу»

Если вы хотите использовать VBA для создания новой рабочей книги, перейдите к разделу «Создание новой рабочей книги».

Для всех других задач VBA Workbook, ознакомьтесь с кратким руководством ниже.

Краткое руководство по книге VBA

В следующей таблице приведено краткое руководство по основным задачам книги VBA.

Задача Исполнение
Доступ к открытой книге с
использованием имени
Workbooks(«Пример.xlsx»)
Доступ к открытой рабочей
книге (открывшейся первой)
Workbooks(1)
Доступ к открытой рабочей
книге (открывшейся последней)
Workbooks(Workbooks.Count)
Доступ к активной книге ActiveWorkbook
Доступ к книге, содержащей
код VBA
ThisWorkbook
Объявите переменную книги Dim wk As Workbook
Назначьте переменную книги Set wk = Workbooks(«Пример.xlsx»)
Set wk = ThisWorkbook
Set wk = Workbooks(1)
Активировать книгу wk.Activate
Закрыть книгу без сохранения wk.Close SaveChanges:=False
Закройте книгу и сохраните wk.Close SaveChanges:=True
Создать новую рабочую книгу Set wk = Workbooks.Add
Открыть рабочую книгу Set wk =Workbooks.Open («C:ДокументыПример.xlsx»)
Открыть книгу только для
чтения
Set wk = Workbooks.Open («C:ДокументыПример.xlsx», ReadOnly:=True)
Проверьте существование книги If Dir(«C:ДокументыКнига1.xlsx») = «» Then
MsgBox «File does not exist.»
EndIf
Проверьте открыта ли книга Смотрите раздел «Проверить
открыта ли книга»
Перечислите все открытые
рабочие книги
For Each wk In Application.Workbooks
Debug.Print wk.FullName
Next wk
Открыть книгу с помощью
диалогового окна «Файл»
Смотрите раздел «Использование диалогового окна «Файл»
Сохранить книгу wk.Save
Сохранить копию книги wk.SaveCopyAs «C:Копия.xlsm»
Скопируйте книгу, если она
закрыта
FileCopy «C:file1.xlsx»,»C:Копия.xlsx»
Сохранить как Рабочая книга wk.SaveAs «Резервная копия.xlsx»

Начало работы с книгой VBA

Мы можем получить доступ к любой открытой книге, используя код Workbooks («Пример.xlsm»). Просто замените Пример.xlsm именем книги, которую вы хотите использовать.

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

Этот пример может показаться немного запутанным для новичка, но на самом деле он довольно прост.

Первая часть до десятичной запятой представляет собой рабочую книгу, вторая часть представляет собой рабочую таблицу, а третья — диапазон. Вот еще несколько примеров записи в ячейку

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

Взгляните на часть книги

Ключевое слово Workbooks относится к совокупности всех открытых рабочих книг. Предоставление имени книги в коллекцию дает нам доступ к этой книге. Когда у нас есть объект, мы можем использовать его для выполнения задач с книгой.

Устранение неполадок в коллекции книг

Когда вы используете коллекцию Workbooks для доступа к книге, вы можете получить сообщение об ошибке:

Run-time Error 9: Subscript out of Range.

Это означает, что VBA не может найти книгу, которую вы передали в качестве параметра.

Это может произойти по следующим причинам:

  1. Рабочая книга в настоящее время закрыта.
  2. Вы написали имя неправильно.
  3. Вы создали новую рабочую книгу (например, «Книга1») и попытались получить к ней доступ, используя Workbooks («Книга1.xlsx»). Это имя не Книга1.xlsx, пока оно не будет сохранено в первый раз.
  4. (Только для Excel 2007/2010) Если вы используете два экземпляра Excel, то Workbooks () относится только к рабочим книгам, открытым в текущем экземпляре Excel.
  5. Вы передали число в качестве индекса, и оно больше, чем количество открытых книг, например Вы использовали
    Workbooks (3), и только две рабочие книги открыты.

Если вы не можете устранить ошибку, воспользуйтесь любой из функций в разделе Поиск всех открытых рабочих книг. Они будут печатать имена всех открытых рабочих книг в «Immediate Window » (Ctrl + G).

Примеры использования рабочей книги VBA

Следующие примеры показывают, что вы можете сделать с книгой.

Примечание. Чтобы попробовать этот пример, создайте две открытые книги с именами Тест1.xlsx и Тест2.xlsx.

Примечание: в примерах кода я часто использую Debug.Print. Эта функция печатает значения в Immediate Window. Для просмотра этого окна выберите View-> Immediate Window из меню (сочетание клавиш Ctrl + G)

Доступ к рабочей книге VBA по индексу

Вы также можете использовать индексный номер с книгами (). Индекс относится к порядку, в котором книга была открыта или создана.

Workbooks (1) относится к книге, которая была открыта первой. Workbooks (2) относится к рабочей книге, которая была открыта второй и так далее.

В этом примере мы использовали Workbooks.Count. Это количество рабочих книг, которые в настоящее время находятся в коллекции рабочих книг. То есть количество рабочих книг, открытых на данный момент. Таким образом, использование его в качестве индекса дает нам последнюю книгу, которая была открыта

Использование индекса не очень полезно, если вам не нужно знать порядок. По этой причине вам следует избегать его использования. Вместо этого вы должны использовать имя рабочей книги вместе с Workbooks ().

Поиск всех открытых рабочих книг

Иногда вы можете получить доступ ко всем рабочим книгам, которые открыты. Другими словами, все элементы в коллекции Workbooks ().

Вы можете сделать это, используя цикл For Each.

Вы также можете использовать стандартный цикл For для доступа ко всем открытым рабочим книгам.

Для доступа к книгам подходит любой из этих циклов. Стандартный цикл For полезен, если вы хотите использовать другой порядок или вам нужно использовать счетчик.

Примечание. Оба примера читаются в порядке с первого открытого до последнего открытого. Если вы хотите читать в обратном порядке (с последнего на первое), вы можете сделать это

Открыть рабочую книгу

До сих пор мы имели дело с рабочими книгами, которые уже открыты. Конечно, необходимость вручную открывать рабочую книгу перед запуском макроса не позволяет автоматизировать задачи. Задание «Открыть рабочую книгу» должно выполняться VBA.

Следующий код VBA открывает книгу «Книга1.xlsm» в папке «C: Документы»

Рекомендуется проверить, действительно ли существует книга, прежде чем открывать ее. Это предотвратит ваши ошибки. Функция Dir позволяет вам легко это сделать.

Проверить открыта ли книга

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

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

Вы можете использовать эту функцию так:

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

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

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

Если вам нужно проверить, открыта ли книга в другом экземпляре Excel, вы можете использовать атрибут ReadOnly книги. Будет установлено значение true, если оно открыто в другом экземпляре.

Закрыть книгу

Закрыть книгу в Excel VBA очень просто. Вы просто вызываете метод Close рабочей книги.

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

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

Очевидно, что вы не можете сохранить изменения в книге, которая в данный момент открыта только для чтения.

Сохранить книгу

Мы только что видели, что вы можете сохранить книгу, когда закроете ее. Если вы хотите сохранить его на любом другом этапе, вы можете просто использовать метод Save.

Вы также можете использовать метод SaveAs

Метод WorkAs SaveAs поставляется с двенадцатью параметрами, которые позволяют вам добавить пароль, установить файл только для чтения и так далее. Вы можете увидеть детали здесь.

Вы также можете использовать VBA для сохранения книги в виде копии с помощью SaveCopyAs.

Копировать книгу

Если рабочая книга открыта, вы можете использовать два метода в приведенном выше разделе для создания копии, т.е. SaveAs и SaveCopyAs.

Если вы хотите скопировать книгу, не открывая ее, вы можете использовать FileCopy, как показано в следующем примере:

Использование диалогового окна «Файл» для открытия рабочей книги

В предыдущем разделе показано, как открыть книгу с заданным именем. Иногда вам может понадобиться, чтобы пользователь выбрал рабочую книгу. Вы можете легко использовать Windows File Dialog.

FileDialog настраивается, и вы можете использовать его так:

  1. Выберите файл.
  2. Выберите папку.
  3. Откройте файл.
  4. «Сохранить как» файл.

Если вы просто хотите, чтобы пользователь выбрал файл, вы можете использовать функцию GetOpenFilename.

Следующая функция открывает книгу с помощью диалога файлов. Функция возвращает полное имя файла, если файл был выбран. Если пользователь отменяет, он отображает сообщение и возвращает пустую строку.

Когда вы вызываете эту функцию, вы должны проверить, отменяет ли пользователь диалог.

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

Вы можете настроить диалог, изменив Title, Filters и AllowMultiSelect в функции UserSelectWorkbook.

Использование ThisWorkbook

Существует более простой способ доступа к текущей книге, чем использование Workbooks() . Вы можете использовать ключевое слово ThisWorkbook. Это относится к текущей книге, то есть к книге, содержащей код VBA.

Если наш код находится в книге, называемой МойVBA.xlsm, то ThisWorkbook и Workbooks («МойVBA.xlsm») ссылаются на одну и ту же книгу.

Использование ThisWorkbook более полезно, чем использование Workbooks (). С ThisWorkbook нам не нужно беспокоиться об имени файла. Это дает нам два преимущества:

  1. Изменение имени файла не повлияет на код
  2. Копирование кода в другую рабочую книгу не требует изменения кода

Это может показаться очень маленьким преимуществом. Реальность такова, что имена будут меняться все время. Использование ThisWorkbook означает, что ваш код будет работать нормально.

В следующем примере показаны две строки кода. Один с помощью ThisWorkbook, другой с помощью Workbooks (). Тот, который использует Workbooks, больше не будет работать, если имя МойVBA.xlsm изменится.

Использование ActiveWorkbook

ActiveWorkbook относится к книге, которая в данный момент активна. Это тот, который пользователь последний раз щелкнул.

Поначалу это может показаться полезным. Проблема в том, что любая рабочая книга может стать активной простым щелчком мыши. Это означает, что вы можете легко записать данные не в ту книгу.

Использование ActiveWorkbook также затрудняет чтение кода. Из кода может быть не очевидно, какая книга должна быть активной.

Надеюсь, я дал понять, что вам следует избегать использования ActiveWorkbook, если в этом нет необходимости. Если вы должны быть очень осторожны.

Примеры доступа к книге

Мы рассмотрели все способы доступа к книге. Следующий код показывает примеры этих способов.

Объявление переменной VBA Workbook

Причина объявления переменной книги состоит в том, чтобы сделать ваш код более легким для чтения и понимания. Проще увидеть преимущество на примере:

Вы можете установить переменную книги с помощью любого из методов доступа, которые мы видели.

Ниже показан тот же код без переменной рабочей книги.

В этих примерах разница несущественная. Однако, когда у вас много кода, использование переменной полезно, в частности, для рабочего листа и диапазонов, где имена имеют тенденцию быть длинными, например thisWorkbook.Worksheets («Лист1»). Range («A1»).

Вы можете назвать переменную книги как wrkRead или wrkWrite. Затем вы можете сразу увидеть, для чего используется эта книга.

Создать новую книгу

Для создания новой рабочей книги вы используете функцию добавления рабочих книг. Эта функция создает новую пустую книгу. Это то же самое, что выбрать «Новая книга» в меню «Файл Excel».

Когда вы создаете новую книгу, вы, как правило, хотите сохранить ее. Следующий код показывает вам, как это сделать.

Когда вы создаете новую книгу, она обычно содержит три листа. Это определяется свойством Application.SheetsInNewWorkbook.

Если вы хотите, чтобы в новой книге было другое количество листов, измените это свойство перед созданием новой книги. В следующем примере показано, как создать новую книгу с семью листами.

With и Workbook

Ключевое слово With облегчает чтение и написание кода VBA. Использование с означает, что вам нужно упомянуть только один раз. С используется с объектами. Это такие элементы, как рабочие книги, рабочие таблицы и диапазоны.

В следующем примере есть два Subs. Первый похож на код, который мы видели до сих пор. Второй использует ключевое слово With. Вы можете увидеть код гораздо понятнее во втором Sub. Ключевые слова End With обозначают конец кода раздела с помощью With.

Резюме

Ниже приводится краткое изложение основных моментов этой статьи.

  1. Чтобы получить рабочую книгу, содержащую код, используйте ThisWorkbook.
  2. Чтобы получить любую открытую книгу, используйте Workbooks («Пример.xlsx»).
  3. Чтобы открыть книгу, используйте Set Wrk = Workbooks.Open («C: Папка Пример.xlsx»).
  4. Разрешить пользователю выбирать файл с помощью функции UserSelectWorkbook, представленной выше.
  5. Чтобы создать копию открытой книги, используйте свойство SaveAs с именем файла.
  6. Чтобы создать копию рабочей книги без открытия, используйте функцию FileCopy.
  7. Чтобы ваш код было легче читать и писать, используйте ключевое слово With.
  8. Другой способ прояснить ваш код — использовать переменные Workbook.
  9. Чтобы просмотреть все открытые рабочие книги, используйте For Every wk в Workbooks, где wk — это переменная рабочей книги.
  10. Старайтесь избегать использования ActiveWorkbook и Workbooks (Index), поскольку их ссылка на рабочую книгу носит временный характер.

Вы можете увидеть краткое руководство по теме в верхней части этой статьи

Заключение

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

Чтобы получить максимальную пользу от этой статьи, я рекомендую вам попробовать примеры. Создайте несколько книг и поиграйтесь с кодом. Внесите изменения в код и посмотрите, как эти изменения влияют на результат. Практика — лучший способ выучить VBA.

Источник

Открыть книгу если закрыта и активировать если открыта

dmtgrs

Дата: Понедельник, 15.02.2021, 12:39 |
Сообщение № 1

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Добрый день.
Есть главный файл Exсel (основной) и много файлов Excel (второстепенные) которые лежат в той же папке. Как сделать так, чтобы макрос в главном файле проверял отрыт ли второстепенный файл, если открыт, то просто активировать его, а если закрыт то открыть.

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 13:02 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1998

±

Замечаний:
0% ±


Excel 2010

[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]


ЮMoney 41001841029809

 

Ответить

Апострофф

Дата: Понедельник, 15.02.2021, 13:13 |
Сообщение № 3

Группа: Проверенные

Ранг: Обитатель

Сообщений: 416


Репутация:

117

±

Замечаний:
0% ±


Excel 1997

[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]

Может так?
[vba]

Код

    On Error Resume Next
    Windows(«Êíèãà1.xls»).Activate
    IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]
Чтоб окно о повторном открытии не выскочило.

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 13:48 |
Сообщение № 4

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1998

±

Замечаний:
0% ±


Excel 2010


ЮMoney 41001841029809

 

Ответить

dmtgrs

Дата: Понедельник, 15.02.2021, 16:29 |
Сообщение № 5

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Огромное всем спасисбо! Работает!

 

Ответить

RAN

Дата: Понедельник, 15.02.2021, 17:05 |
Сообщение № 6

Группа: Друзья

Ранг: Экселист

Сообщений: 5645


Но и заскакивает не открытая книга, а ее сохраненный экземпляр.


Быть или не быть, вот в чем загвоздка!

 

Ответить

Nic70y

Дата: Понедельник, 15.02.2021, 19:35 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 8134


Репутация:

1998

±

Замечаний:
0% ±


Excel 2010

Где это написано?


ЮMoney 41001841029809

 

Ответить

RAN

Дата: Понедельник, 15.02.2021, 19:45 |
Сообщение № 8

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Workbooks.Open Filename:=»D:Êíèãà1.xls»

книга открывается не зависимо от того, открыта она, или нет, а вот тут

 IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

только при наличии ошибки (книга закрыта)

И попутно
в отличие от
[vba]

Код

Workbooks(«Êíèãà1.xls»).Activate

[/vba]
[vba]

Код

Windows(«Êíèãà1.xls»).Activate

[/vba]
выдаст ошибку, если книга открыта более, чем в одном окне. (Вид >> Новое окно)


Быть или не быть, вот в чем загвоздка!

Сообщение отредактировал RANПонедельник, 15.02.2021, 19:54

 

Ответить

probkinfeda

Дата: Среда, 17.02.2021, 07:34 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

5

±

Замечаний:
0% ±


Мне кажется что лучше будет так и никаких ошибок
[vba]

Код

Sub fdsg()
Dim XX As Workbook, ImaKnigi$
ImaKnigi$ = «Kniga1.xls»
For Each XX In Workbooks
If XX.Name = ImaKnigi Then XX.Activate: Exit Sub
Next XX
Workbooks.Open Filename:=ThisWorkbook.Path & «» & ImaKnigi
End Sub

[/vba]

 

Ответить

китин

Дата: Среда, 17.02.2021, 08:29 |
Сообщение № 10

Группа: Модераторы

Ранг: Экселист

Сообщений: 6973


Репутация:

1063

±

Замечаний:
0% ±


Excel 2007;2010;2016

probkinfeda, — Прочитайте Правила форума
— Оформите код тегами (в режиме правки поста выделите код и нажмите кнопку #, пояснялка здесь)


Не судите очень строго:я пытаюсь научиться
ЯД 41001877306852

 

Ответить

dmtgrs

Дата: Четверг, 18.02.2021, 10:43 |
Сообщение № 11

Группа: Пользователи

Ранг: Новичок

Сообщений: 25


Репутация:

0

±

Замечаний:
0% ±


Excel 2016

Может так?

[vba]

Код

On Error Resume Next
Windows(«Êíèãà1.xls»).Activate
IF ERR THEN Workbooks.Open Filename:=»D:Êíèãà1.xls»

[/vba]

Чтоб окно о повторном открытии не выскочило.

Макрос прекрасно работает! Огромное спасибо! В 2019 офисе все работает как часы! Но вот в 2010 офисе если открыть основной файл, из него открыть с помощью макроса второстепенный файл, во второстепенном файле внести какие то изменения, но еще не сохранить, то при работе макроса excel начинает ругаться, что второстепенный файл уже открыт и предупреждает, что если нажать «ОК» все несохранившиеся изменения потеряются. 2019 офис просто активирует второстепенный файл, тк он уже открыт, а 2010 офис посему то не активирует его, а пытается открыть заново

 

Ответить

Понравилась статья? Поделить с друзьями:
  • Vba excel открыть книгу для записи
  • Vba excel оператор условия
  • Vba excel открыть книгу в фоновом режиме
  • Vba excel оператор like
  • Vba excel открыть для чтения открытый файл