Новости:

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

Главное меню

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

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

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

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
Вдруг так получится?
С уважением, Алексей

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