Новости:

Название темы должно отражать суть задачи.
Темы типа "ПОМОГИТЕ!!!", "Срочно!" и т.п. будут удаляться без объяснения причин

Главное меню

Блокировка повторного открытия файла

Автор Starbirst, 09.12.2016, 13:46:06

« назад - далее »

Starbirst

Ребята! Столкнулся с такой ситуацией: на сетевом диске имеется файл excel. Подскажите, пожалуйста, можно ли поставить блокировку на файл, чтобы избежать одновременного открытия файла разными пользователя, имеющими доступ к файлу? Макросами не владею. Хотелось бы что-то вроде высплывающего окошка: "файл используется другим пользователем, попробуйте позже". И как избежать двойного открытия файла с одного ПК? Т. е. например при попытке дважды открыть один и тот же файл было окошко "невозможно открыть дважды". Спасибо всем откликнувшимся.

Дмитрий Щербаков(The_Prist)

Эта функция присутствует изначально. Перейдите на вкладку Рецензирование -Доступ к книге. Убедитесь, что снята галочка "Разрешить изменять файл нескольким пользователям..."
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

Дело в том, что доступ к редактированию необходим каждому пользователю, но, чтобы одновременно не могли открывать и редактировать файл

Дмитрий Щербаков(The_Prist)

#3
Да. И для этого надо обязательно снять общий доступ через меню Excel, как я написал выше. Мы об одном и том же говорим?
Стандартно, если файл не расшарен через Рецензирование, то при попытке открыть другим пользователем появится уведомление, что файл уже открыт другим пользователем и его можно открыть только для чтения.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

Режим для чтения открывает файл, а хотелось бы, чтобы файл не был доступен для открытия и просмотра, пока в нем работает другой пользователь

Дмитрий Щербаков(The_Prist)

Цитата: Starbirst от 09.12.2016, 13:46:06Хотелось бы что-то вроде высплывающего окошка: "файл используется другим пользователем, попробуйте позже"
Не совсем понял. Вы хотите, чтобы файл вообще нельзя было открыть? А если у человека просто напросто макросы запрещены?
Если хотите делать надежно - то это не в Excel делается. Если все же в Excel хотите - вот здесь я описывал как это можно сделать и в пределах одного ПК и в сети:
Как проверить открыта ли книга?

Но для этого придется заставлять людей открывать файл только из другого файла.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

#6
Файл, на который не могу ввести ограничения по одновременному доступу (открытию), располагается на сетевом диске, он с макросами. Данный файл открывается из базового файла, который тиеется на локальном диске каждого пользователя. Совместный одновременный доступ к файлу хочется запретить, дабы не было ошибок макросов, люди итак в excel не умеют работать, а если возникнут ошибки макросов, вообще паника будет.

A-Michael

Цитировать...люди итак в excel не умеют работать, а если возникнут ошибки макросов, вообще паника будет.
О, как Вы верно подметили. Сколько раз с этим сталкивался: "Я ничего не делал(а), оно само!"
Я - не волшебник, я ещё только учусь...

Дмитрий Щербаков(The_Prist)

Цитата: Starbirst от 10.12.2016, 01:11:26Данный файл открывается из базового файла
И чем тогда решение по ссылке не подходит? Там в конце есть именно Ваш случай.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

Дело в том, что кто-то из пользователей на своём рабочем месте открывает файл, кто-то удаленно работает, например, с ноута или планшета. Не каждый понимает, что одновременно открывать файл с макросами не рекомендуется.

Дмитрий Щербаков(The_Prist)

ну как еще Вам объяснить, что НАДО ПРОЧИТАТЬ СТАТЬЮ? Вы читали?
Если сам файл открывается опять же кодом(судя по Вашим словам так и есть) - то там есть ответ. Приведена функция, которая определяет открыт ли файл кем-то еще. Попробовали её использовать? Если да - что не получается, не так происходит, что непонятно?
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Alex_ST

Дмитрий, Starbirst в Миру практически одновременно создал кросспост.
Я ему там уже практически всё то же самое, что ты здесь советовал. И другую функцию для проверки статуса книги советовал If GetAttr(ThisWorkbook.FullName) And vbReadOnly Then MsgBox "Файл занят. Зайдите позже"
, но оттуда он исчез.
(К стати, брат-близнец твоей IsBookOpen, но с, ИМХО, более корректной обработкой Err, у меня тоже в копилке лежит, но я его описывать не сталFunction FileIsBusy(File$) As Boolean   ' не открывая файла проверяет, открыт ли он вообще кем-либо
    Dim FN%: FN = FreeFile
    On Error Resume Next
    Open File For Random Access Write Lock Write As #FN
    Close #FN
    FileIsBusy = (Err <> 0)
End Functio
)
Что мешает ему использовать макросы в файле с общим доступом. лежащим на расшаренном сетевом диске, я не знаю...
Скорее всего просто макросы там кривые и на общий доступ не рассчитаны. А IT-шник, эти макросы когда-то написавший, по каким-то причинам дорабатывать файл не хочет или не может.
С уважением, Алексей

Дмитрий Щербаков(The_Prist)

Цитата: Alex_ST от 10.12.2016, 12:45:47более корректной обработкой Err
Да такая же обработка. Более корректно, это если Err.Number использовать. Но т.к. это свойство по умолчанию для данного объекта(как Value для Range) - его можно опустить.
Т.к. функция объявлена As Boolean, то она вернет False в случае, если Err =0 и True во всех остальных случаях :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

Ребята, спасибо большое, что вы рткликаетесь на мою проблему. Макросы возможно кривые. Как писал The_Prist я по ночам подворовываю готовые макросы и как могу переделываю их под себя))) Куда деваться, если даже знаний английского нет.

Starbirst

Alex_ST, подскажите код в книге должен быть?

Alex_ST

Да, без основ английского, конечно очень тяжело с VBA
Даже контекстная Справка и та на инглише.
С уважением, Алексей

Дмитрий Щербаков(The_Prist)

Цитата: Starbirst от 10.12.2016, 14:08:11подскажите код в книге должен быть?
я не Алекс, но подскажу: не видя Ваших кодов сложно сказать что и где должно быть. Большинство макросов работают в книге с общим доступом(100% будут ошибки, если кодом изменяются параметры защиты листов или книги, создаются таблицы, проверки данных и прочие запрещенные в общем доступе действия).
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

The_Prist в файле реализована работа между листами, передача данных между ними, диапазоны таблицы меняются

Starbirst

Файл около 1 м весит, не могу скинуть

Дмитрий Щербаков(The_Prist)

Ну что можно еще советовать? Как проверить открыт ли этот файл уже кем-то - подсказали.
Дальше - уже все от Вас зависит. Даже если бы скинули файл - все коды ковырять Ваши, выискивая что там может вызывать ошибку не очень-то благодарное дело. Т.к. есть подозрение, что написаны они не особо грамотно и содержат много лишнего.
В этой статье от Microsoft перечислены ограничения для общих книг.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Starbirst

The_Prist подскажите, код, предложенный Alex_ST должен быть в книге какого файла: который лежит на сетевом диске или же в том файле, который открывает этот внешний файл?

Дмитрий Щербаков(The_Prist)

#21
Вот смотрите: я Вам дал ссылку на статью, где аналогичный код, но читать которую Вам лень. И давая ссылку я написал откуда запускать. Но т.к. читать Вы ни сообщения, ни статью не хотите - ждите Алекса, пусть объясняет. Я не знаю уже как Вам объяснять, если читать сами не хотите.
Чтобы понять откуда и как - достаточно перечитать эту тему с самого начала. Там в самом начале все это есть.

P.S. Почему я просто не напишу что и откуда? Потому что считаю, что если человек не читает данные ранее ответы, считая их неинтересными, то и я вправе считать неинтересным занятием повторение ранее озвученного.

P.P.S. Для раздумий: приведенная функция - это код, который не может быть запущен из закрытой книги. И если чуть поднапрячься, то станет ясно, что располагать этот код в самом сетевом файле, открытие которого хотим предотвратить - идиотизм. Т.к. на момент выполнения кода из этого же файла он в любом случае будет открыт. Мне это кажется очевидным. А Вам? Как следствие - остается только один верный вариант расположения данного кода...
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...

Alex_ST

Starbirst, у вас задача поставлена с ног на голову.
Ситуация такая: на сети есть файл, с которым нужно работать нескольким пользователям, но разрешать общий доступ в нём нельзя, т.к. написанные Вами макросы перестают работать.
И вместо того, чтобы пытаться проанализировать, что мешает Вашим макросам работать в режиме общего доступа к файлу Вы пытаетесь просто запретить доступ к нему более чем одного пользователя.
The_Prist дал Вам ссылку на описание ограничений при работе с файлами общего доступа.
Почитайте её. Она на русском языке. Если Ваши макросы делают что-то из списка запрещённых для файлов общего доступа операций, пересмотрите логику работы.
Если ничего из запрещённых нет, то значит макросы делают что-то не разрешённое для достижения нужных не запрещённых результатов.
С уважением, Алексей

Starbirst

Файл сложный и ещё до конца не доработанный. Могу на иайл скинуть

Alex_ST

Вы сначала говорите, что
Цитата: Starbirst от 10.12.2016, 15:03:38Файл около 1 м весит
потом добавляете, что к тому же
Цитата: Starbirst от 10.12.2016, 20:05:10Файл сложный и ещё до конца не доработанный
А потом предлагаете в нём разобраться мне? Благодарю покорно. Но лучше уж Вы сами как-нибудь.
Например, попробуйте в модуль ЭтаКнига файла прописать обработчик события её открытия, который, увидев, что книга открыта только для чтения, должен закрыть еёPrivate Sub Workbook_BeforeClose(Cancel As Boolean)
    If GetAttr(ThisWorkbook.FullName) And vbReadOnly Then ThisWorkbook.Close False
End Sub

С уважением, Алексей

Alex_ST

Упс!
Проверил на локальном файле у себя на компе, сохранив его с рекомендацией открывать только для чтения.
Проверил процедуру. Не работает.
Стал разбирать в пошаговом режиме.
Оказывается, что GetAttr считывает не режим, в котором открыт файл, а атрибуты файла в файловой системе. А т.к. атрибуты файла в ФС - это сосвем не то, что опция, с которой он открыт, то процедура, естественно, не срабатывает, т.к. GetAttr(ThisWorkbook.FullName) всегда не зависимо от режима открывания возвращает 32 (vbArchive), а не 1 (vbReadOnly)  :(
Какая-то команда явно должна быть и для чтения режима открытия. Но я не помню.
Может быть Дмитрий подскажет?


С уважением, Алексей

Starbirst

Есть макрос, запрещающий доступ к файлу при отсутствии ключевого файла. При открытие файла в каталоге создаётся скрытые временный файл -$. Почему данный макрос не видит этот скрытый файл, соответственно не блокируется двойное открытие. Можно ли каким-то образом сделать так, чтобы макрос видел этот скрытый темповский файл?

Alex_ST

#27
По заданному вопросу о запрете открытия в режиме ReadOnly вот это точно работает:Private Sub Workbook_Open()
    If ThisWorkbook.ReadOnly Then MsgBox "ReadOnly": ThisWorkbook.Close False
End Sub

А по поводу Вашего крайнего поста:
Цитата: Starbirst от 11.12.2016, 08:06:16Есть макрос, запрещающий доступ к файлу при отсутствии ключевого файла
Если у Вас есть списанный откуда-то макрос и по нему есть вопросы, то создайте новый топик, выложите там макрос (очень желательно со ссылкой на первоисточник) и там же и задавайте вопросы.
С уважением, Алексей

Starbirst

Alex_ST разные варианты вставки кода пробовал, в моём случае не работает, пробовал создать новый файл, вставил код - работает безупречно. Спасибо вам за предложенный код, буду пробовать кондовать, чтобы и в моём файле сработал :)

Alex_ST

Я, честно говоря, даже не представляю, какие могут быть варианты вставки кода...
Хотя... Есть ещё один редко используемый, т.к. это "рудиментарный орган" для обеспечения совместимости с совсем уж старыми версиями, но до сих пор работающий способ: использовать не обработчик события Workbook_Open, а Auto_Open (это событие возникает и обрабатывается даже ещё раньше)
Попробуйте вместо  Workbook_Open в модуле ЭтаКнига создать стандартный модуль (Insert — Module ...) и прописать в нём Sub Auto_Open()   'Открытие файла - событие, предшествующее Workbook_Open
    If ThisWorkbook.ReadOnly Then MsgBox "ReadOnly": ThisWorkbook.Close False
End Sub
Вдруг так получится?
С уважением, Алексей

Alex_ST

С уважением, Алексей

Starbirst

Благодарю Alex_ST, попробую предложенный вами вариант, обязательно отпишусь через неделю по приезду.

Starbirst

Попробовал ваш вариант - тоже не работает в моем файле :-( либо что-то неверно делаю, либо косяк в файле, хотя пробовал на стороннем файле - все работает. Спасибо!

Alex_ST

Цитата: Starbirst от 28.12.2016, 08:13:47не работает в моем файле
Для удобства отладки измените запись процедуры - разверните однострочный If ... Then в многострочную классическую запись If ... Then ... End If и поставьте в начале СТОП:
    Sub Auto_Open()
        Stop
        If ThisWorkbook.ReadOnly Then
            MsgBox "ReadOnly"
            ThisWorkbook.Close False 
        End If
    End Sub 
Попробуйте открыть файл.
Если откроется, значит по какой-то причине событие открытия файла почему-то не обрабатывается.
Если вылетит в VBE, то пройдите дальше в пошаговом режиме F8 и выясните, почему не работает процедура.
С уважением, Алексей

Яндекс.Метрика Рейтинг@Mail.ru