Вопрос: Открытие файла | Добавлено: 10.08.08 18:07 |
Автор вопроса: ![]() |
Подскажите, пожалуйста, как проверить, открыт уже нужный мне файл?
Код функции, открывающей файл, такой: 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 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 381648295 Вопросов: 8 Ответов: 32 |
Профиль | Цитата | #2 | Добавлено: 11.08.08 22:16 |
Ну что, кто-нибудь откликнется?
Напишите хоть что-то, если нельзя - напишите, что нельзя, если вопрос глупый - так и скажите, а то меня что-то все игнорируют... Может, я где-то провинился? |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 278109632 Вопросов: 42 Ответов: 3949 |
Web-сайт: Профиль | Цитата | #3 | Добавлено: 11.08.08 23:21 |
А может никто не знает ![]() |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 0 Ответов: 36 |
Профиль | Цитата | #4 | Добавлено: 12.08.08 00:22 |
Private Sub Test()
If WorkbookIsOpen("Книга5.xls" ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 381648295 Вопросов: 8 Ответов: 32 |
Профиль | Цитата | #6 | Добавлено: 12.08.08 09:26 |
Виноват, ошибочка вышла:
Вместо Exit Sub
Надо Exit Function
|
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 381648295 Вопросов: 8 Ответов: 32 |
Профиль | Цитата | #7 | Добавлено: 12.08.08 09:41 |
Всё равно не получается.
При двух открытых книгах Эксель: XLApp.Workbooks.Count = 0
|
Номер ответа: 8 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 278109632 Вопросов: 42 Ответов: 3949 |
Web-сайт: Профиль | Цитата | #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 Автор ответа: ![]() ![]() ![]() ![]() 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-сайт: Профиль | Цитата | #10 | Добавлено: 12.08.08 12:22 |
у меня все работает прекрасно |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 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 Автор ответа: ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ICQ: 381648295 Вопросов: 8 Ответов: 32 |
Профиль | Цитата | #14 | Добавлено: 12.08.08 21:01 |
Если мы с вами придумаем, как это сделать, этот код можно будет смело записывать в библиотеку полезных кодов (или как она там называется...).
Я уже 2 дня весь инет излазил и ничего не нашёл касаемо моего вопроса... |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Администратор ICQ: 278109632 Вопросов: 42 Ответов: 3949 |
Web-сайт: Профиль | Цитата | #15 | Добавлено: 12.08.08 23:45 |
Optional HiddenMode As Boolean = False |
|