Страница 1 из 1
Excel-открыт ли файл, существует ли лист
Добавлено: 13 апр 2009, 11:04
anval
Добрый день!
Как проверить условия:
1) заданная книга открыта
2)в книге существует лист с заданным именем
Я проверяю эти условия, сравнивая в цикле все имена соответствующих семейств - Workbooks ("For Each w In Workbooks") или Worksheets ("For Each w In Worksheets") с заданным. Наверное, для этого есть более грамотный способ?
Спасибо
Re: Excel-открыт ли файл, существует ли лист
Добавлено: 13 апр 2009, 11:53
Naeel Maqsudov
Давайте поставим вопрос чуть шире:
Есть ли в коллекции элемент с неким ID?
Так как ID элемента коллекции (по крайне мере у метода Item) может указываться как числом, так и именем, то кроме перебора элементов в цикле другого способа увы нет.
Оптимизировать перебор, однако, можно.
Если организацию цикла по элементам возложить на сам VBA (на реализацию метода Item) то, надо полагать, это будет гораздо эффективнее, чем если бы мы сами написали такой цикл. Т.е. я предлагаю просто взять и обратиться к элементу коллекции по имени. Если такового в коллекции нет - то будет исключение которое нетрудно поймать.
Вот функция, которая находит элементы любых коллекций.
Так как ID
Код: Выделить всё
Function finditem(ACollection As Object, AName As String, ByRef Item As Variant) As Boolean
On Error GoTo Wrong
Set Item = ACollection.Item(AName)
finditem = True
Exit Function
Wrong:
finditem = False
End Function
'тестируем функцию
Sub qwe()
Dim X As Object
If finditem(Workbooks, "Книга1", X) Then
MsgBox X.Name
Else
MsgBox "Not Found"
End If
If finditem(Sheets, "Лист999", X) Then
MsgBox X.Name
Else
MsgBox "Not Found"
End If
End Sub
Re: Excel-открыт ли файл, существует ли лист
Добавлено: 13 апр 2009, 12:40
mc-black
Чуть упростил функцию от
Naeel Maqsudov, суть та же:
Код: Выделить всё
Option Explicit
Function FindItem(objCollection As Object, strName As String, ByRef Item As Object) As Boolean
On Error Resume Next
Set Item = objCollection(strName)
FindItem = IsObject(objCollection(strName))
End Function
Sub qwe()
Dim X As Object
If FindItem(Workbooks, "Книга1", X) Then
MsgBox X.Name
Else
MsgBox "Not Found"
End If
If FindItem(Sheets, "Лист999", X) Then
MsgBox X.Name
Else
MsgBox "Not Found"
End If
End Sub
Re: Excel-открыт ли файл, существует ли лист
Добавлено: 13 апр 2009, 13:39
anval
Naeel Maqsudov,mc-black - спасибо, воспользуюсь Вашими предложениями