Страница: 1 | 2 |
Вопрос: Открытие файла
Добавлено: 10.08.08 18:07
Автор вопроса: Jktu | ICQ: 381648295
Ответы
Всего ответов: 24
Номер ответа: 16
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #16
Добавлено: 13.08.08 00:03
Я вот такое изобрел...
Dim ff As Integer
ff = FreeFile
On Error Resume Next
Open FileName For Binary Lock Read As #ff
IsWorkbookOpened = (Err.Number <> 0)
On Error GoTo 0
Close #ff
End Function
Номер ответа: 17
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #17
Добавлено: 13.08.08 09:46
To Jktu: А фоновый режим обязателен ? Может просто проверять файл на ReadOnly ?
If ActiveWorkbook.ReadOnly Then
MsgBox "ReadOnly", vbOKOnly, "Title"
Workbooks(":\Book1.xls".Close SaveChanges:=False
Else
MsgBox "Read Not Only", vbOKOnly, "Title"
'дальнейшая обработка файла
End If
Номер ответа: 18
Автор ответа:
Jktu
ICQ: 381648295
Вопросов: 8
Ответов: 32
Профиль | | #18
Добавлено: 13.08.08 14:51
О! Спасибо!
Jasmin, давно Вас ждал.
To Executioner & Jasmin:
Вечером посмотрю дома, попробую, сейчас некогда и даже, признаться, не успел вникнуть. Извините.
To Jasmin: Фоновый режим не обязателен, но желателен, чтобы пользователю во время работы программы не мешал открытый экселевский файл и не вызывал вопросов и соблазна что-нибудь там исправить (испортить).
И потом. Когда программно создаётся копия Excel.Application, она ВСЕГДА (прочитал в книжке по VB) является скрытой. Конечно, всегда можно для неё установить свойство Visible = True, только зачем.
Значит, VB не видит файл, потому что он в фоновом режиме? А что, нельзя сделать так, чтобы он видел? Так сказать, зрение ему улучшить?
Тогда бы все проблемы отпали.
Номер ответа: 19
Автор ответа:
Jktu
ICQ: 381648295
Вопросов: 8
Ответов: 32
Профиль | | #19
Добавлено: 13.08.08 17:48
Ура!!! Свершилось!
Executioner, Ваш код работает!
Правда, мне ещё пока неясно, как он работает, но, думаю, разберусь обязательно!
Номер ответа: 20
Автор ответа:
Jktu
ICQ: 381648295
Вопросов: 8
Ответов: 32
Профиль | | #20
Добавлено: 13.08.08 17:51
Спасибо всем!
Но если у вас будут какие-нибудь ещё мысли по этой теме, прошу выкладывать, буду очень благодарен.
Может быть, можно как-то проверять книгу на открытие без создания отдельной функции (одной-двумя строчками кода). Это упростит код и улучшит его эстетичность и удобочитаемость.
Номер ответа: 21
Автор ответа:
Jktu
ICQ: 381648295
Вопросов: 8
Ответов: 32
Профиль | | #21
Добавлено: 13.08.08 17:54
Вот окончательный код:
If Right(Path, 1) <> "\" Then Path = Path & "\"
If Not IsWorkbookOpened(Path & Name) Then
Dim XLApp As New Excel.Application
Set OpenData = XLApp.Workbooks.Open(Path & Name)
If HiddenMode Then OpenData.Hidden = True
Set XLApp = Nothing
Else
Set OpenData = Workbooks(Name)
End If
End Function
Function IsWorkbookOpened(ByVal FileName As String) As Boolean
Dim FF As Integer
FF = FreeFile
On Error Resume Next
Open FileName For Binary Lock Read As #FF
IsWorkbookOpened = (Err.Number <> 0)
On Error GoTo 0
Close #FF
End Function
Номер ответа: 22
Автор ответа:
Jasmin
Вопросов: 23
Ответов: 417
Профиль | | #22
Добавлено: 13.08.08 20:09
Еще вот так:
On Error Resume Next
WorkbookIsOpen = (TypeOf Workbooks(iName$) Is Workbook)
End Function
Или так:
On Error Resume Next
WorkbookIsOpen = (TypeName(Workbooks(iName$)) = "Workbook"
End Function
Пример вызова:
MsgBox WorkbookIsOpen("Имя_Книги.xls"
End Sub
Номер ответа: 23
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #23
Добавлено: 13.08.08 20:48
вот тебе все одной функцией
If Right(Path, 1) <> "\" Then Path = Path & "\"
Dim FF As Integer
FF = FreeFile
On Error Resume Next
Open Path & Name For Binary Lock Read As #FF
IsWorkbookOpened = (Err.Number <> 0)
If Err.Number = 0 Then
On Error GoTo 0
Close #FF
Dim XLApp As New Excel.Application
Set OpenData = XLApp.Workbooks.Open(Path & Name)
If HiddenMode Then OpenData.Hidden = True
Set XLApp = Nothing
Else
Set OpenData = Workbooks(Name)
End If
End Function
Номер ответа: 24
Автор ответа:
Администратор
ICQ: 278109632
Вопросов: 42
Ответов: 3949
Web-сайт:
Профиль | | #24
Добавлено: 13.08.08 20:51
А работает это все предельно просто. Пытаемся открыть файл с блокировкой чтения, но если он уже открыт с расшаренным чтением, как это делает эксель, то естественно возникает ошибка №70 - ошибка доступа. Чем мы и пользуемся.