Страница 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 - спасибо, воспользуюсь Вашими предложениями