Добрый день, знатоки. Подскажите возможно ли средствами VBA определить открыт ли уже файл (который я хочу открыть) другим пользователем (ну или мной)? Хочется вместо системного сообщения и прекращения работы макроса выводить свой msgbox и работать по обстановке (занят файл/не занят).
Почитал, поковырялся - пока не нашел. Всем заранее спасибо.
Что-то я не понял... Вы что хотите: 1. Не открывая книгу, узнать, не открыта ли она в режиме монопольного доступа кем-то другим? 2. Узнать программно, кем, когда и в каком режиме открыта книга общего доступа?
В любом случае посмотрите, может быть что-нибудь наковыряете для себя из этого: Sub Workbook_UserStatus () 'Свойство UserStatus Property возвращает 2D-массив (1 to 3), содержащий информацию _ о каждом пользователе, открывшем книгу в режиме общего доступа. '1-й столбец - имя пользователя, открывшего книгу в режиме общего доступа, _ 2-й столбец - дата и время, когда этот пользователь открыл книгу, _ 3-й столбец - индикатор режима открытия книги (1 - монопольный, 2 - общий доступ). Debug.Print IIf(Workbooks("personal.xls").UserStatus(1, 3) = 1, "Exclusive", "Shared") End Sub
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Option Compare Text 'Если Вы не понимаете, зачем используется эта инструкция, то оставьте её в покое
Private Function WorkbookIsOpen(iName$) As Boolean '***********************************************' ' Дата создания 01/01/2005 ' Автор Климов Павел Юрьевич ' http://www.msoffice.nm.ru '***********************************************' Dim iBook As Workbook For Each iBook In Workbooks If iBook.Name = iName$ Then WorkbookIsOpen = True Exit Function End If Next WorkbookIsOpen = False End Function
Private Function WorkbookIsOpen(iName$) As Boolean '***********************************************' ' Дата создания 01/01/2005 ' Автор Климов Павел Юрьевич ' http://www.msoffice.nm.ru '***********************************************' Dim iBook As Workbook For Each iBook In Workbooks If StrComp(iBook.Name, iName$, vbTextCompare) = 0 Then WorkbookIsOpen = True Exit Function End If Next WorkbookIsOpen = False End Function Вариант II. Private Function WorkbookIsOpen(iName$) As Boolean '***********************************************' ' Дата создания 01/01/2005 ' Автор Климов Павел Юрьевич ' http://www.msoffice.nm.ru '***********************************************' On Error Resume Next WorkbookIsOpen = IsObject(Workbooks(iName$)) End Function
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 Function WorkbookIsOpen(iName$) As Boolean On Error Resume Next WorkbookIsOpen = (VarType(Workbooks(iName$)) = vbObject) End Function
Private Function WorkbookIsOpen(iName$) As Boolean On Error Resume Next WorkbookIsOpen = Len(Workbooks(iName$).Name) > 0 End Function
Private Function WorkbookIsOpen(iName$) As Boolean On Error Resume Next WorkbookIsOpen = Workbooks(iName$).Index > 0 End Function Пример вызова любой из вышеопубликованных авторских функций : Private Sub Test() MsgBox WorkbookIsOpen("Имя_Книги.xls") End Sub
Мужики, я так понял, что книга расшарена и лежит на серваке, но общий доступ в ней не разрешён. Очевидно, что Сергею не хочется ДАЖЕ ПРОБОВАТЬ открывать эту книгу по каким-то причинам (это его дело, по каким) в случае если она уже открыта кем-то другим. Ну, брезгливый он, капример :-) Тогда может прокатить такой вариант: 1. В AutoOpen этой книги прописываете процедуру записи в те её Properties, которые видно даже без открытия файла, какого-нибудь заранее оговоренного свойства (ну, например,комментария). И сразу же там же - сохранение книги. 2. В AutoClose этой книги прописываете удаление этого комментария перед сохранением. 3. В своём Personal пропишите Ёкселю, чтобы попытке открыть любой файл сначала читаел у него комментарий и по нему уже определял, открыт файл кем-то или нет.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Дмитрий (The_Prist), а чем это принципиально отличается от тог, что я советовал в 15:53: Sub Workbook_UserStatus () Debug.Print IIf(Workbooks("personal.xls").UserStatus(1, 3) = 1, "Exclusive", "Shared") End Sub
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
{quote}{login=Сергей М}{date=25.11.2010 04:55}{thema=}{post} Dim asUsersAs String asUsers = Workbooks(путь с диском, каталогом).UserStatus сразу же выдал ошибку 9{/post}{/quote} Ну, этого и следовало ожидать. Ведь в примерах и я и Дмитрий писАли в скобках у Workbooks не Workbooks(путь с диском, каталогом), а имя ОТКРЫТОЙ книги: Workbooks("Книга1.xls") или Workbooks("personal.xls").
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Сергей, а почему вы не хотите открыть книгу, заблокировав сообщения Application.DisplayAlerts = False, потом проверить её UserStatus и если он вас не устраивает, сразу её закрыть и опять разрешить сообщения?
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Проверка нужна перед тем как открывать файл чтобы внести в него изменения (макросом), а если там (в файле) уже кто-то сидит, то макрос может сработать коряво. Вот и хочется не открывать.
Можно сделать вывод что файл НЕ открыт, если выдает ошибку?
У вас что, макрос что-то выполняет по событию Workbook_Open (или по AutoOpen)? Ну тогда первым же действием и встройте в него проверку на то, открыт ли файл уже кем-то другим.
С уважением, Алексей(ИМХО: Excel-2003 - THE BEST!!!)
Function IsOpen(File$) As Boolean Dim FN% FN = FreeFile On Error Resume Next Open File For Random Access Read Write Lock Read Write As #FN Close #FN IsOpen = Err End Function
Sub Test() Debug.Print IsOpen("C:\Test.xls") End Sub
{quote}{login=слэн}{date=26.11.2010 08:38}{thema=}{post}а где ставится непосредственно этот флаг lock ?{/post}{/quote} Где-то в файловой системе операционки :-)
Эксклюзтвный доступ к папке, файлу или к его части операционная система предоставляет для запросившего процесса. Такой доступ снимается либо по команде Unlock из этого же процесса, либо автоматически через некоторое время после закрытия процесса.