Подскажите, как запретить одновременное открытие файла более чем одним юзером? Требуется закрыть часть полей для одного из юзеров. Сейчас он может открыть для чтения и увидеть секретные поля, когда файл открыт другим.
Подскажите, как запретить одновременное открытие файла более чем одним юзером? Требуется закрыть часть полей для одного из юзеров. Сейчас он может открыть для чтения и увидеть секретные поля, когда файл открыт другим.zud
Сообщение отредактировал zud - Среда, 19.12.2012, 11:15
при открытии файла (workbook_open) проверяется наличие некоего файла (пустой файл с названием, напр. FileIsUsed): если этот файл есть - целевой файл закрывается, нет - открывается и создает файл-индикатор. При закрытии удаляет файл-индикатор
при открытии файла (workbook_open) проверяется наличие некоего файла (пустой файл с названием, напр. FileIsUsed): если этот файл есть - целевой файл закрывается, нет - открывается и создает файл-индикатор. При закрытии удаляет файл-индикаторСаня
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 Function
[/vba]Только вот куда её вставить? Что-то не соображу...
А может быть как-то UDF-ку заюзать:[vba]
Code
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 Function
[/vba]Только вот куда её вставить? Что-то не соображу...Alex_ST
Сань, а зачем внешний файл я не понял? Может быть при открытии сразу куда-то (например, в CustomDocumentProperties или в Names) прописать флаг. А при закрытии флаг сбрасывать. Если при открытии файла событие Auto_Open обнаруживает флаг, то файл закрывается.
Сань, а зачем внешний файл я не понял? Может быть при открытии сразу куда-то (например, в CustomDocumentProperties или в Names) прописать флаг. А при закрытии флаг сбрасывать. Если при открытии файла событие Auto_Open обнаруживает флаг, то файл закрывается.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 20.12.2012, 15:58
у меня была "подобная" ситуация: несколько людей должны были заполнять один файл, но по-очереди и тот файл был как "фонарь", типа "подожди, не трогай" свойство или имя - это хорошо, но их не видно, во-первых а во-вторых, как я прочел не так давно в шибко умной книжке, код от данных должен быть отделен, т.е., код не должен менять носитель, в котором содержится...
у меня была "подобная" ситуация: несколько людей должны были заполнять один файл, но по-очереди и тот файл был как "фонарь", типа "подожди, не трогай" свойство или имя - это хорошо, но их не видно, во-первых а во-вторых, как я прочел не так давно в шибко умной книжке, код от данных должен быть отделен, т.е., код не должен менять носитель, в котором содержится... Саня
Сань, отделять код от данных можно и нужно в базах данных, а вот как код от данных отделить в нашей любимой головоломке, раз она (он) заточена именно на совместное их хранение именно в виде единого файла?
Сань, отделять код от данных можно и нужно в базах данных, а вот как код от данных отделить в нашей любимой головоломке, раз она (он) заточена именно на совместное их хранение именно в виде единого файла?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Четверг, 20.12.2012, 16:56
если ты имеешь ввиду программу Excel и все, что связано с ней с точки зрения программирования, то разделение здесь реализуется с помощью надстроек, отдельных программных книг (Personal тот же)...
Quote
в нашей любимой головоломке
если ты имеешь ввиду программу Excel и все, что связано с ней с точки зрения программирования, то разделение здесь реализуется с помощью надстроек, отдельных программных книг (Personal тот же)...Саня
Надстройки и персонал хороши для хранения кода, работающего только на этой машине. Если же файл выкладывается на расшаренном ресурсе, то по неволе будешь вынужден делать микст из кода и данных. А вообще-то тема заинтересовала. Путь решения понятен. Код получится не сложный. Вот только как его защитить от защиты от макросов? Сегодня уже слепить пример не успею. А завтра попробую.
Надстройки и персонал хороши для хранения кода, работающего только на этой машине. Если же файл выкладывается на расшаренном ресурсе, то по неволе будешь вынужден делать микст из кода и данных. А вообще-то тема заинтересовала. Путь решения понятен. Код получится не сложный. Вот только как его защитить от защиты от макросов? Сегодня уже слепить пример не успею. А завтра попробую.Alex_ST
да я не спорю, что есть ситуации, когда код не стоит отделять от данных... тем более, что это даже глупо
по-поводу защиты от отключенных макросов - делал раз так: добавил лист в книгу, оставил в нем одну ячейку, в нее красными чернилами "Макросы отключены!!!", остальные листы "Очень скрыты". Макросы включены - рабочие листы отображаются, дополнительный скрывается, при закрытии - наоборот.
да я не спорю, что есть ситуации, когда код не стоит отделять от данных... тем более, что это даже глупо
по-поводу защиты от отключенных макросов - делал раз так: добавил лист в книгу, оставил в нем одну ячейку, в нее красными чернилами "Макросы отключены!!!", остальные листы "Очень скрыты". Макросы включены - рабочие листы отображаются, дополнительный скрывается, при закрытии - наоборот.Саня
Саня, я это именно так и собирался завтра сделать: по BeforeClose "шибко ныкать" все листы и показывать только один с инструкцией по включению макросов (обращаться к нему по специфическому CodeName). А по Open прятать лист с инструкцией и показывать все. (уж и не помню, где, когда и у кого подсмотрел/подслушал такой способ, но запомнил и даже как-то где-то сам применял)
Саня, я это именно так и собирался завтра сделать: по BeforeClose "шибко ныкать" все листы и показывать только один с инструкцией по включению макросов (обращаться к нему по специфическому CodeName). А по Open прятать лист с инструкцией и показывать все. (уж и не помню, где, когда и у кого подсмотрел/подслушал такой способ, но запомнил и даже как-то где-то сам применял)Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 21.12.2012, 09:24
Ну вот как-то примерно так получилось: При открытии книги первым пользователем в ней создаётся невидимое имя, задаваемое в коде константой Const sFlag$, красный лист-плакат с объявлением о необходимости включить макросы прячется, а все остальные показываются. Имя автоматически удаляется из книги при закрытии файла и все листы, кроме красного плаката, скрываются. Если другой пользователь во время работы первого попытается тоже открыть книгу, то в книге будет обнаружено уже созданное первым пользователем имя и файл будет сразу закрыт. Если у пользователя отключены макросы, то при открытии книги процедура отображения скрытых листов не выполнится и ему будет виден только этот лист. Как быть, если у пользователя отключены макросы и он при этом не первый открывший - НЕ ЗНАЮ!!!
Проверить не смог, т.к. я у локального файла всегда первый открывший, а расшаривать и народ на других компах отвлекать от работы не хочу.
Ну вот как-то примерно так получилось: При открытии книги первым пользователем в ней создаётся невидимое имя, задаваемое в коде константой Const sFlag$, красный лист-плакат с объявлением о необходимости включить макросы прячется, а все остальные показываются. Имя автоматически удаляется из книги при закрытии файла и все листы, кроме красного плаката, скрываются. Если другой пользователь во время работы первого попытается тоже открыть книгу, то в книге будет обнаружено уже созданное первым пользователем имя и файл будет сразу закрыт. Если у пользователя отключены макросы, то при открытии книги процедура отображения скрытых листов не выполнится и ему будет виден только этот лист. Как быть, если у пользователя отключены макросы и он при этом не первый открывший - НЕ ЗНАЮ!!!
Проверить не смог, т.к. я у локального файла всегда первый открывший, а расшаривать и народ на других компах отвлекать от работы не хочу.Alex_ST
критика: 1. открыл, макросы off, три листа отображены - не то, что хотелось 2. при закрытии появляется "красный октябрь" и диалог о сохранении - не приемлемо 3. в начале открыл (как-то), закрыл, а потом при повторном открытии "книга уже кем-то используется"
критика: 1. открыл, макросы off, три листа отображены - не то, что хотелось 2. при закрытии появляется "красный октябрь" и диалог о сохранении - не приемлемо 3. в начале открыл (как-то), закрыл, а потом при повторном открытии "книга уже кем-то используется" Саня
Что-то там не так... Ну, во-первых, я приаттачил к предыдущему посту файл, не закрыв его и, соответственно, не дав убить имя и заныкать листы. Побороть "плакат" при закрытии я , кажется , забыл… Надо посмотреть. Вот выложил уже закрытый.
Что-то там не так... Ну, во-первых, я приаттачил к предыдущему посту файл, не закрыв его и, соответственно, не дав убить имя и заныкать листы. Побороть "плакат" при закрытии я , кажется , забыл… Надо посмотреть. Вот выложил уже закрытый.Alex_ST
Проверил. Оказывается "плакат" при закрытии и запрос на сохранение я не поборол. И, честно говоря, пока не понимаю как можно одновременно и вопрос подавить (ведь книга-то при закрытии изменяется - имя убивается, листы скрываются, "плакат" показывается), и изменения юзера сохранить если нужно, и дать ему возможность выйти без сохранения если вдруг что-то в файле налажал?
Проверил. Оказывается "плакат" при закрытии и запрос на сохранение я не поборол. И, честно говоря, пока не понимаю как можно одновременно и вопрос подавить (ведь книга-то при закрытии изменяется - имя убивается, листы скрываются, "плакат" показывается), и изменения юзера сохранить если нужно, и дать ему возможность выйти без сохранения если вдруг что-то в файле налажал?Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Пятница, 21.12.2012, 13:58
Господа, вам так и не удалось решить эту проблему? У меня аналогичная проблема. Фаил лежит в Dropbox (программа для общего хранения и пользования файлами) попробовал ваш файлик открыл его с двух компов первый раз все работало. Потом постоянно выдает, что фаил открыт другим пользователем. Если вы нашли решение, помогите пожалуйста.
Господа, вам так и не удалось решить эту проблему? У меня аналогичная проблема. Фаил лежит в Dropbox (программа для общего хранения и пользования файлами) попробовал ваш файлик открыл его с двух компов первый раз все работало. Потом постоянно выдает, что фаил открыт другим пользователем. Если вы нашли решение, помогите пожалуйста.Гисер
Странно, что с файлом, лежащим на Dropbox, вообще ч то-то получилось. Ведь папка на Dropbox - это достаточно большая разница по сравнению с расшаренной папкой на файл-селвере в локалке. Там и протоколы другие, и время фиксации изменений в файле. Dropbox - это по сути самостоятельные папки с файлами "в облаке", содержимое которых синхронизируется с их зеркалами на локальных компах. И фиксируются только сохраненные изменения в файлах. Поэтому странно, что вообще что-то получилось. В модифицированном коде программы я сделал так, что сразу же после открытия файла, не открытого кем-то ещё, в нём не только прописывается имя-признак того, что он уже открыт, но и сразу же сохраняется. Правда, могут возникнуть потом трудности с открыванием файла, который был некорректно закрыт (например, просто по краху Офиса или разрыву коннекта. И предупреждаю: БЕЗ СОХРАНЕНИЯ ФАЙЛА ЗАКРЫТЬ ЕГО ТЕПЕРЬ НЕ УДАСТСЯ !!!
Странно, что с файлом, лежащим на Dropbox, вообще ч то-то получилось. Ведь папка на Dropbox - это достаточно большая разница по сравнению с расшаренной папкой на файл-селвере в локалке. Там и протоколы другие, и время фиксации изменений в файле. Dropbox - это по сути самостоятельные папки с файлами "в облаке", содержимое которых синхронизируется с их зеркалами на локальных компах. И фиксируются только сохраненные изменения в файлах. Поэтому странно, что вообще что-то получилось. В модифицированном коде программы я сделал так, что сразу же после открытия файла, не открытого кем-то ещё, в нём не только прописывается имя-признак того, что он уже открыт, но и сразу же сохраняется. Правда, могут возникнуть потом трудности с открыванием файла, который был некорректно закрыт (например, просто по краху Офиса или разрыву коннекта. И предупреждаю: БЕЗ СОХРАНЕНИЯ ФАЙЛА ЗАКРЫТЬ ЕГО ТЕПЕРЬ НЕ УДАСТСЯ !!!Alex_ST
Не подходит к сожалению данный вариант Пришла такая мысль! Что если создать отдельную папку "Обработка" и написать макрос который когда открываешь файл перемещает его туда. Второй пользователь заходит видит, что файла нет, соответственно с ним работает кто то другой. А после закрытия макрос перемещает его на свое место. А вот в написании такого макроса прошу помощи у вас господа специалисты.
Не подходит к сожалению данный вариант Пришла такая мысль! Что если создать отдельную папку "Обработка" и написать макрос который когда открываешь файл перемещает его туда. Второй пользователь заходит видит, что файла нет, соответственно с ним работает кто то другой. А после закрытия макрос перемещает его на свое место. А вот в написании такого макроса прошу помощи у вас господа специалисты.Гисер
Ну, переместить открытый файл из папки в папку - это вряд ли... Можно, конечно, сразу после открытия файла пересохранить и открыть его у себя на компе, а источник на DropBox'е убить. А при закрытии опять скинуть на DropBox , а у себя убить... Но как-то это слишком много рискованных пересылок по сети, да и тяжёлый файл будет сливаться долго, т.к. апстрим всё-таки чаще всего меньше даунстрима. А комп, сервер или канал может и глюкнуть во время пересылки... Возможен, наверное, другой вариант с "защитой от честных людей". Не в отдельной папке файлик-признак класть, а там же рядышком класть какой-нибудь пустой txt-файлик с таким же именем, как у Excel-файла. (с таким же - чтобы в проводнике они рядышком визуально были и не злонамеренный юзер, увидев его, даже и не пытался файл открыть, а пустой - чтобы махоньким был и потому быстро синхронизировался с DropBox'ом). В отдельную папку прятать файл-признак, ИМХО, смысла нет, т.к. пользователь-вредитель на своём компе всё равно при желании эту папку найдёт и файлик, мешающий открывать интересующий его файл, оттуда удалит, а синхронизация DropBox'а уже удалит и его "зеркало в облаке". При этом процедуры в моём примере меняются незначительно - нужно вместо записи в файл имени-признака просто создавать рядом файл-признак. А при закрытии - удалять его. Попробую, конечно подпилить, но я сейчас на больничном (сопли на клаву текут ручьём и от кашля даблклики по мышке получаются вместо кликов, да и жена в постель гонит, градусником размахивая и ингалятором угрожая ) А весь набранный сундук бесценных сокровищ (файлы-примеры и литература) на компе на работе. Попробую урвать время и что-нибудь вспомнить (давно ничего не писАл - завал на работе)
Ну, переместить открытый файл из папки в папку - это вряд ли... Можно, конечно, сразу после открытия файла пересохранить и открыть его у себя на компе, а источник на DropBox'е убить. А при закрытии опять скинуть на DropBox , а у себя убить... Но как-то это слишком много рискованных пересылок по сети, да и тяжёлый файл будет сливаться долго, т.к. апстрим всё-таки чаще всего меньше даунстрима. А комп, сервер или канал может и глюкнуть во время пересылки... Возможен, наверное, другой вариант с "защитой от честных людей". Не в отдельной папке файлик-признак класть, а там же рядышком класть какой-нибудь пустой txt-файлик с таким же именем, как у Excel-файла. (с таким же - чтобы в проводнике они рядышком визуально были и не злонамеренный юзер, увидев его, даже и не пытался файл открыть, а пустой - чтобы махоньким был и потому быстро синхронизировался с DropBox'ом). В отдельную папку прятать файл-признак, ИМХО, смысла нет, т.к. пользователь-вредитель на своём компе всё равно при желании эту папку найдёт и файлик, мешающий открывать интересующий его файл, оттуда удалит, а синхронизация DropBox'а уже удалит и его "зеркало в облаке". При этом процедуры в моём примере меняются незначительно - нужно вместо записи в файл имени-признака просто создавать рядом файл-признак. А при закрытии - удалять его. Попробую, конечно подпилить, но я сейчас на больничном (сопли на клаву текут ручьём и от кашля даблклики по мышке получаются вместо кликов, да и жена в постель гонит, градусником размахивая и ингалятором угрожая ) А весь набранный сундук бесценных сокровищ (файлы-примеры и литература) на компе на работе. Попробую урвать время и что-нибудь вспомнить (давно ничего не писАл - завал на работе)Alex_ST