Как проверить открыта ли книга?
Что умеет Excel
Собственно суть темы отражена в названии. Как при выполнении кода из VBA узнать перед обращением к книге открыта она или нет? Ведь если книга закрыта, то обращение к ней вызовет ошибку, а если открывать без проверки — то это может повлечь за собой утерю данных, если предварительно эта книга не была сохранена. Ни один ни второй вариант, естественно, не устраивают. Я покажу два способа проверки через функции. Если функция вернет True — книга открыта, если False — закрыта. Для проверки функций используем проверочную процедуру Check_Open_Book:
Sub Check_Open_Book() If bBookOpen("Книга1.xls") Then MsgBox "Книга открыта", vbInformation, "Сообщение" Else MsgBox "Книга закрыта", vbInformation, "Сообщение" End If End Sub
Sub Check_Open_Book()
If bBookOpen("Книга1.xls") Then
MsgBox "Книга открыта", vbInformation, "Сообщение"
Else
MsgBox "Книга закрыта", vbInformation, "Сообщение"
End If
End SubДанная процедура вызывает функцию bBookOpen, передавая ей в качестве параметра имя книги, «открытость» которой мы хотим проверить. Я приведу два варианта самой функции bBookOpen.
Вариант 1:
Function bBookOpen(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 bBookOpen = True: Exit For End If End If Next wbBook End Function
Function bBookOpen(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 bBookOpen = 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 bBookOpen = True: Exit For End If
If Windows(wbBook.Name).Visible Then
If wbBook.Name = wbName Then bBookOpen = True: Exit For
End Ifна одну строку(просто убрать лишнее условие проверки)
If wbBook.Name = wbName Then bBookOpen = True: Exit For
If wbBook.Name = wbName Then bBookOpen = True: Exit For
Либо можно воспользоваться Вариантом 2:
Function bBookOpen(wbName As String) As Boolean Dim wbBook As Workbook: On Error Resume Next Set wbBook = Workbooks(wbName) bBookOpen = Not wbBook Is Nothing End Function
Function bBookOpen(wbName As String) As Boolean
Dim wbBook As Workbook: On Error Resume Next
Set wbBook = Workbooks(wbName)
bBookOpen = Not wbBook Is Nothing
End FunctionДанный способ обращается к любой открытой книге — будь то PERSONAL.XLS или надстройка.
Также см.:
→Как узнать существует ли лист в книге?

2966
