Страницы: 1
RSS
Проверить, открыт ли сетевой файл?
 
Добрый вечер, уважаемые форумчане! По этой теме нашёл нижеследующий макрос, но он действует лишь с файлами, находящимися на компе, а не в сети. Подскажите, что надо добавить в него?  
Dim wbBook as workbook  
On error resume next  
set wbBook = workbooks("Книга1.xls")  
If wbBook is nothing then    
msgbox "Книга1 не открыта"  
else  
msgbox "Книга1 открыта"  
End if  
Причём, в названии сетевого файла указываю его полный путь.
 
Не нужен полный путь.  
Этот код просто обращается к открытой книге по имени. Если такой не нашлось - значит не открыта.  
Никакой привязки к пути тут нет - это может быть локальная или сетевая Книга1.xls.  
А вот когда такая книга найдётся - тогда можно и её Path проверить.
 
Спасибо, Hugo. Завтра проверю, без указания полного пути. А как это проверить её Path? Для чего, не объясните? Эта проверка мне нужна для того, чтоб вносить или подождать вносить макросом данные в этот локальный файл.
 
Для чего Path?  
Для успокоения совести - что файл именно тот Книга1.xls, который нужен, а не какой-нибудь с десктопа.  
 
 
Dim wbBook As Workbook  
On Error Resume Next  
Set wbBook = Workbooks("Книга1.xls")  
If wbBook Is Nothing Then  
MsgBox "Книга1 не открыта"  
Else  
MsgBox wbBook.Path & "\" & wbBook.Name & " открыта"  
End If
 
Добрый вечер, Hugo. Проверил сегодня ваш совет. Написал в том макросе не полный путь сетевого файла, а лишь тот, что указан был в макросе. Результат: если сетевой файл открыт иным пользователем, то этот макрос его не фиксирует, а лишь, если он открыт был мною..
 
Так вот что нужно...  
Так бы сразу и сказали :)  
А то привели код, который проверяет совсем другое...  
Я 100% надёжного способа не знаю, т.к. сам не нуждаюсь в таком функционале.  
Но тут на днях была тема - очень надёжно должно быть с использованием текстового файла-флага. Кто файл открывает - тот ставит флаг, что занято. Типа как в туалете :)  
Остальные сперва смотрят на флаг, а не сразу ломятся :)  
Но это сравнительно сложная конструкция...
 
Проверка, открыт ли файл эксклюзивно кем-нибудь:  
http://www.planetaexcel.ru/forum.php?thread_id=21737
 
Здравствуйте, Hugo и ZVI. Большое вам спачибо за ответы.  
Hugo, я нашёл об этом в поисковике. Очень внятно вы объснили фунуционал. )) Пытался применить, но ничего не получается. Скорее, не туда вписываю эти готовые макросы. Вроде, и не новичёк в этом деле, но всё никак не получается..  
ZVI, вписал этот макрос, но, почему-то, постоянно ругается на UserStatus..
 
{quote}{login=Эльчин}{date=03.11.2011 07:45}{thema=}{post}ZVI, вписал этот макрос, но, почему-то, постоянно ругается на UserStatus..{/post}{/quote}  
Уточните, о чем речь.  
По ссылке не было никакого UserStatus-а, там был только такой текст и код:  
 
> Проверка, открыт ли файл эксклюзивно кем-нибудь  
> Без загрузки файла в Excel:  
 
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
 
ZVI, вот как я поступил: вставил ваш макрос в новый модуль. Указал мою книгу. Нажимаю на кнопку воспроизведения. Что-то происходит, но ничего не выдаётся. Открыл тот файл. Снова проверил, и снова ничего не выдаётся. Что не так?
 
UserStatus был приведён в ином, не в вашем макросе. И во всех случаях указывало на ошибку именно в этой строке.
 
{quote}{login=Эльчин}{date=03.11.2011 08:37}{thema=}{post}UserStatus был приведён в ином, не в вашем макросе. И во всех случаях указывало на ошибку именно в этой строке.{/post}{/quote}Если ошибка в ином макросе, то это же другая история, не правда ли? Что можно сказать, не видя макроса? :-)  
 
Но, если я правильно понял Ваш вопрос (в названии темы), то требуется всего лищь узнать, открыт ли в Excel файл кем-либо, включая и Вас, или не открыт. Для этого не нужно пытаться его загружать себе в Excel, достаточно в макросе Test указать путь к файлу и выполнить макрос - в отладочном окне Immediate выведется True или False.  
 
Если нужно вывести сообщение не в окно Immediate, а на экран, то вместо Debug.Print напишите MsgBox вот так, например:  
 
Sub Test()  
MsgBox IsOpen("C:\Test.xls")  
End Sub  
 
или так:  
 
Sub Test()  
 Const MyFile = "C:\Test.xls"  
 If IsOpen(MyFile) Then  
   MsgBox "Файл " & MyFile & " уже используется", vbExclamation  
 Else  
   MsgBox "Файл " & MyFile & " никем не используется", vbInformation  
 End If  
End Sub
 
Да, вы совершенно правы, это уже иная история.. )  
Спасибо вам большое, что остаётесь неравнодушны к вопросу. Завтра протестирую ваш макрос на работе. Интересно, будет ли он реагировать на сетевой файл, открытый иным пользователем. Мне это, особенно, и нужно. Вставлю его в код своей программки, а в случае обнаружения факта открытия файла, макрос прервёт на время своё исполнение, пока я не подтвержу о его закрытии. Как вам такая идея, реализуема?
 
{quote}{login=Эльчин}{date=04.11.2011 12:17}{thema=}{post}... Интересно, будет ли он реагировать на сетевой файл, открытый иным пользователем ... Как вам такая идея, реализуема?{/post}{/quote}  
Должен реагировать, идея реализуема.  
Если возникнут проблемы, то лучше приложите небольшой пример, с тем же UserStatus :-)
 
Я завтра тоже тщательно на работе проверю.  
Но кажется, что я уже раньше такой подход тестил - и мне всегда показывало, что файл с общим доступом свободен...
 
{quote}{login=Hugo}{date=04.11.2011 01:24}{thema=}{post}... что файл с общим доступом ...{/post}{/quote}  
Игорь, из контекста следует, что речь не идет о проверке общей книги, которая сохранена в Excel с флажком, установленным через меню: Сервис - Доступ к общей книге - Разрешить изменять файл нескольким пользователям одновременно.  
При этом бы файл не блокировался и разрешал одновременную работу с ним, но книга имела бы значительные ограничения по функциональности.  
 
Очевидно, здесь ситуация, когда обычная книга выложена в общем ресурсе локальной сети и она доступна для нескольких человек.  
Для первого пользователя, открывшего файл, Excel устанавливает монопольное право на редактирование этого файла и локирует (Locking) его. При этом все остальные пользователи могут открывать этот файл только с правом чтения и не могут сохранить изменения. Им придется ждать, пока первый пользователь не "отпустит" файл, закрыв его у себя в Excel.  
 
Для проверки не нужна локальная сеть, достаточно открыть 2 экземпляра Excel (из ярлыка), в одном открыть книгу, а во другом проверить.
 
{quote}{login=ZVI}{date=03.11.2011 08:08}{thema=Re: }{post}  
> Проверка, открыт ли файл эксклюзивно кем-нибудь{/post}{/quote}  
И здесь и в теме по приводимой ссылке я подчеркивал, что речь - про _ЭКСКЛЮЗИВНО_ , то есть, с монопольщным правом редактирования.
 
Владимир, с Вашего позволения, дам ссылку на эту тему в своей (интересные вопросы).
Я сам - дурнее всякого примера! ...
 
Сергей, Вам за ссылки только спасибо скажут, а меня за многочисленные опечатки, надеюсь, простят :-)
 
Владимир, мы вам всё простим, главное оставайтесь с нами ))  
 
Мне хоть обычно не нужна помощь форума, но я всегда с интересом читаю ваши сообщения и изучаю код )
 
Уважаемый ZVI, вы совершенно верно изложили суть моего вопроса. Да, речь идёт об обычном файле Excel, находящемся в локальной сети. Сегодня проверил приведённый вами макрос. Весьма вам благодарен! Всё супер! )) Работает верно, как с файлом, который находится непосредственно на своём компе, так и с файлом, находящимся в локальной сети. Вариант с MsgBox весьма удачен. ) Рекомендую всем, кто заинтересовался этим вопросом!  Тут,  самое главное, обратить внимание на точность пути к сетевому файлу и на его расширение. Ещё раз вам большое спасибо от меня и от тех, кто собирается применить это в своей работе! )
 
Изучая Function IsOpen(File$) As Boolean (ZVI 03.11.2011, 20:08) в Help - 97 наткнулся на следующее  
 
"Примечание.   Инструкцию Open не следует использовать для доступа к собственным типам файлов приложений. Например, не следует использовать Open для доступа к документу Word, к электронной таблице Microsoft Excel или к базе данных Microsoft Access, поскольку это вызовет потерю целостности и порчу файла."    
 
Хотелось-бы усышать комментарии относительно использования функции в контексте данного примечания.
 
{quote}{login=RAN}{date=06.06.2012 10:21}{thema=}{post}Хотелось-бы усышать комментарии относительно использования функции в контексте данного примечания.{/post}{/quote}  
Комментарий: иногда пишут, что и использование макросов опасно :-)  
 
Не бойтесь, функция IsOpen ничего не пишет в файл, лишь делает попытку открыть файл и сразу же закрывает его, никакой потери целостности не будет, так как ничего не пишется в файл.  
 
Если файл кем-то уже открыт с эксклюзивным (по умолчанию) доступом, то выполнить Open просто не удастся. А если файл не открыт, то в справке, очевидно, имелось в виду, что формат файла XLS не документирован, и если в него что-то наобум записать, то это и "вызовет потерю целостности и порчу файла"
 
Спасибо, Владимир!  
Я и сам пришел к таким выводам, но решил уточнить, а вдруг...  
 
И еще один вопрос.  
Если файл уже открыт, во втором экземпляре требуется отключить макросы (ну или блокировать Private Sub Workbook_Open()).  
Я сочинил так  
Private Sub Workbook_Open()  
On Error Resume Next  
ThisWorkbook.ChangeFileAccess xlReadWrite  
If Err Then  
MsgBox "ПрЮвет!"  
Else  
MsgBox "Тю-Тю!": Exit Sub  
End If  
End Sub  
Насколько правильно подобное? Или лучше другой метод? Например пытаться сохранить изменения?
 
Андрей, этот вопрос уже немного не по теме :-)    
 
Можно использовать тот факт, что если файл уже кем-то открыт эксклюзивно, то его копия загружается в режиме "только для чтения":  
 
' Код в модуле ЭтаКнига  
Private Sub Workbook_Open()  
If Me.ReadOnly Then Exit Sub  
' Ниже - код для того, кто открыл файл эксклюзивно  
' ...  
End Sub
 
Ну если только немного.:-)  
Я тоже использовал тот факт, что второй экземпляр открывается "только для чтения", но с другого бока.  
До If Me.ReadOnly Then Exit Sub не дошел!  
Еще раз спасибо!
 
Добрый день!  
подскажите пожалуйста.  
при использовании кода:  
 
Sub Test()  
Const MyFile = "C:\Test.xls"  
If IsOpen(MyFile) Then  
MsgBox "Файл " & MyFile & " уже используется", vbExclamation  
Else  
MsgBox "Файл " & MyFile & " никем не используется", vbInformation  
End If  
End Sub  
 
выдает ошибку "Sub or Function not defined"  
выделяя при этом условие "IsOpen"    
выдает при проверке книги размещённой как на локальном компьютере так и в сети.
 
А указанный файл по указанному пути имеется?
 
Добрый день.  
Вы скорее всего не скопировали саму функцию IsOpen.  
См. сообщение от ZVI 03.11.11 20:08
 
Юрий М  
файл имеется  
sva  
попробую, спасибо!
Страницы: 1
Читают тему
Loading...