Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 1 | 2 |

 

  Вопрос: Открытие файла Добавлено: 10.08.08 18:07  

Автор вопроса:  Jktu | ICQ: 381648295 
Подскажите, пожалуйста, как проверить, открыт уже нужный мне файл?
Код функции, открывающей файл, такой:

Public Function OpenData(Path As String, Name As String, OpenMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim XLApp As New Excel.Application
Set OpenData = XLApp.Workbooks.Open(Path & Name)
Set XLApp = Nothing

End Function


Во время открытия файла может так оказаться, что нужный мне файл уже открыт в фоновом, то есть скрытом, режиме (OpenMode=False).
Так вот, чтобы избежать открытия ещё одного экземпляра файла, нужно во время выполнения функции OpenData проверить, не открыт ли он уже.
Заранее благодарен.

Ответить

  Ответы Всего ответов: 24  

Номер ответа: 1
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #1 Добавлено: 10.08.08 18:11
Наверное, вот так будет правильнее:

Public Function OpenData(Path As String, Name As String, Optional HiddenMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim XLApp As New Excel.Application
Set OpenData = XLApp.Workbooks.Open(Path & Name)
If HiddenMode Then OpenData.Hidden = True
Set XLApp = Nothing

End Function

Ответить

Номер ответа: 2
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #2 Добавлено: 11.08.08 22:16
Ну что, кто-нибудь откликнется?
Напишите хоть что-то, если нельзя - напишите, что нельзя, если вопрос глупый - так и скажите, а то меня что-то все игнорируют...
Может, я где-то провинился?

Ответить

Номер ответа: 3
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #3
Добавлено: 11.08.08 23:21
А может никто не знает =)

Ответить

Номер ответа: 4
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 36
 Профиль | | #4 Добавлено: 12.08.08 00:22
Private Sub Test()
    If WorkbookIsOpen("Книга5.xls";) Then
        MsgBox "Книга открыта!", 64, ""
    Else
        MsgBox "Книга не открыта!", 48, ""
    End If
End Sub


Private Function WorkbookIsOpen(iName$) As Boolean
    On Error Resume Next
    WorkbookIsOpen = Len(Workbooks(iName$).Name) > 0
End Function


P.S. Автор Pashulka (Климов Павел Юрьевич)

Ответить

Номер ответа: 5
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #5 Добавлено: 12.08.08 09:22
Не работает функция WorkbookIsOpen.
Хоть книга открыта, хоть не открыта, при любом HiddenMode:
Workbooks(iName$).Name = Subscript out of range.
Может быть, так:
' Если внутри функции OpenData вставить такой код:
Dim i As Integer
If Not XLApp.Workbooks Is Nothing Then
    For i = 1 To XLApp.Workbooks.Count
        If XLApp.Workbooks(i) = Name Then
            Set OpenData = XLApp.Workbooks(i)
            Exit Sub
        End If
    Next i
End If

Ответить

Номер ответа: 6
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #6 Добавлено: 12.08.08 09:26
Виноват, ошибочка вышла:
Вместо
Exit Sub

Надо
Exit Function

Ответить

Номер ответа: 7
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #7 Добавлено: 12.08.08 09:41
Всё равно не получается.
При двух открытых книгах Эксель:

XLApp.Workbooks.Count = 0

Ответить

Номер ответа: 8
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #8
Добавлено: 12.08.08 11:19
Private Function WorkbookIsOpen(iName$) As Boolean
    On Error Resume Next
    WorkbookIsOpen = Len(Workbooks(iName$).Name) > 0
End Function

При ошибке WorkbookIsOpen вернет ложь. Насколько я понимаю, по задумке так и должно быть.

Ответить

Номер ответа: 9
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #9 Добавлено: 12.08.08 11:58
В том-то и дело, что в любом случае WorkbookIsOpen возвращает ложь.
Хоть есть открытые книги, хоть их нет.
Ведь, если Workbooks(iName$).Name = Subscript out of range,
то Len(Workbooks(iName$).Name) или будет = 0 или
On Error Resume Next >> End Function, а WorkbookIsOpen как была False, так и остаётся.
А Workbooks(iName$).Name почему-то всегда = Subscript out of range

Ответить

Номер ответа: 10
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #10
Добавлено: 12.08.08 12:22
у меня все работает прекрасно

Ответить

Номер ответа: 11
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #11 Добавлено: 12.08.08 13:01
Попробовал и в Excele и в Visual Studio.
Везде одинаково.
У меня тоже работает, только если книга не скрыта.
Открываю Data.xls, делаю её скрытой, запускаю Test().
Msgbox "Книга не открыта".
Потому что функция WorkbookIsOpen её не видит, когда она скрыта.
В окне Immediate выяснил (во время выполнения функции WorkbookIsOpen): Workbooks(iName$).Name = Subscript out of range
Может быть, как-то ещё по-другому можно?

Ответить

Номер ответа: 12
Автор ответа:
 Pavel



Вопросов: 0
Ответов: 36
 Профиль | | #12 Добавлено: 12.08.08 18:34
Попробуйте

'Source: http://j-walk.com/ss/excel/tips/tip54.htm
Private Function WorkbookIsOpen(wbname) As Boolean
'   Returns TRUE if the workbook is open
    Dim x As Workbook
    On Error Resume Next
    Set x = Workbooks(wbname)
    If Err = 0 Then WorkbookIsOpen = True _
        Else WorkbookIsOpen = False
End Function

Ответить

Номер ответа: 13
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #13 Добавлено: 12.08.08 20:58
Мне непонятно 2 момента:
1. Почему моей функцией (OpenData) файл открывается всегда в скрытом режиме при любом значении параметра HiddenMode?
2. Почему VB не видит этот самый скрытый файл?
Ведь поэтому, Ваша, Pavel, функция (WorkbookIsOpen) всегда выдаёт Err = 9, то есть "Subscript out of range"
Вот мой код:

Public Function OpenData(Path As String, Name As String, Optional HiddenMode As Boolean) As Object

If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim XLApp As New Excel.Application
If Not WorkbookIsOpen(Name) Then
    Set OpenData = XLApp.Workbooks.Open(Path & Name)
End If
If HiddenMode Then OpenData.Hidden = True
Set XLApp = Nothing

End Function

Ответить

Номер ответа: 14
Автор ответа:
 Jktu



ICQ: 381648295 

Вопросов: 8
Ответов: 32
 Профиль | | #14 Добавлено: 12.08.08 21:01
Если мы с вами придумаем, как это сделать, этот код можно будет смело записывать в библиотеку полезных кодов (или как она там называется...).
Я уже 2 дня весь инет излазил и ничего не нашёл касаемо моего вопроса...

Ответить

Номер ответа: 15
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #15
Добавлено: 12.08.08 23:45
Optional HiddenMode As Boolean = False

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам