Страница: 1 | 2 |
Вопрос: Открытие файла
Добавлено: 10.08.08 18:07
Автор вопроса: Jktu | ICQ: 381648295
Подскажите, пожалуйста, как проверить, открыт уже нужный мне файл?
Код функции, открывающей файл, такой:
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
Наверное, вот так будет правильнее:
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-сайт:
Профиль | | #3
Добавлено: 11.08.08 23:21
А может никто не знает
Номер ответа: 4
Автор ответа:
Pavel
Вопросов: 0
Ответов: 36
Профиль | | #4
Добавлено: 12.08.08 00:22
If WorkbookIsOpen("Книга5.xls" Then
MsgBox "Книга открыта!", 64, ""
Else
MsgBox "Книга не открыта!", 48, ""
End If
End Sub
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.
Может быть, так:
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
Виноват, ошибочка вышла:
Вместо
Надо
Номер ответа: 7
Автор ответа:
Jktu
ICQ: 381648295
Вопросов: 8
Ответов: 32
Профиль | | #7
Добавлено: 12.08.08 09:41
Всё равно не получается.
При двух открытых книгах Эксель:
Номер ответа: 8
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #8
Добавлено: 12.08.08 11:19
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-сайт:
Профиль | | #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
Попробуйте
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"
Вот мой код:
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-сайт:
Профиль | | #15
Добавлено: 12.08.08 23:45
Optional HiddenMode As Boolean = False