Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

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

 

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

Автор вопроса:  Jktu | ICQ: 381648295 

Ответить

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

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



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

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #16
Добавлено: 13.08.08 00:03
Я вот такое изобрел...

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

Ответить

Номер ответа: 17
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #17 Добавлено: 13.08.08 09:46
To Jktu: А фоновый режим обязателен ? Может просто проверять файл на ReadOnly ?
  Workbooks.Open Filename:=";D:\Book1.xls"
  If ActiveWorkbook.ReadOnly Then
    MsgBox "ReadOnly", vbOKOnly, "Title"
    Workbooks(";D:\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
Вот окончательный код:

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

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
Еще вот так:
Private Function WorkbookIsOpen(iName$) As Boolean
    On Error Resume Next
    WorkbookIsOpen = (TypeOf Workbooks(iName$) Is Workbook)
End Function


Или так:
Private Function WorkbookIsOpen(iName$) As Boolean
    On Error Resume Next
    WorkbookIsOpen = (TypeName(Workbooks(iName$)) = "Workbook";)
End Function

Пример вызова:
Private Sub Test()
    MsgBox WorkbookIsOpen("Имя_Книги.xls";)
End Sub

Ответить

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



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

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #23
Добавлено: 13.08.08 20:48
вот тебе все одной функцией
Public Function OpenData(Path As String, Name As String, Optional HiddenMode As Boolean) As Object

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-сайт: domkratt.com
 Профиль | | #24
Добавлено: 13.08.08 20:51
А работает это все предельно просто. Пытаемся открыть файл с блокировкой чтения, но если он уже открыт с расшаренным чтением, как это делает эксель, то естественно возникает ошибка №70 - ошибка доступа. Чем мы и пользуемся.

Ответить

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

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



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