Lost your password?


Хитрости »
Основные понятия (27)
Сводные таблицы и анализ данных (10)
Графики и диаграммы (5)
Работа с VB проектом (12)
Power BI и Power Query (23)
Условное форматирование (5)
Списки и диапазоны (5)
Макросы(VBA процедуры) (68)
Разное (43)
Баги и глюки Excel (5)

Каждому пользователю свой лист/диапазон

Очень часто на своих тренингах и в форумах я слышу вопрос: как защитить доступ к книге так, чтобы для каждого пользователя был доступен только свой лист/листы? А другие ячейки или листы были недоступны для изменения или просмотра? Или скрыть отдельные столбцы с глаз пользователя? Часть подобного функционала предоставляется стандартными средствами Excel, а другая(например, доступность просмотра только конкретных листов) достигается только через макросы. В этой статье хочу привести несколько примеров реализации подобных разграничений прав между пользователями, их плюсы и минусы.

Разграничение прав доступа при помощи VBA



 
Разграничение доступа к ячейкам стандартными средствами
Для разграничения доступа к ячейкам на листе можно воспользоваться инструментом Разрешить изменение диапазонов(Allow Users to Edit Ranges), расположенном на вкладке Рецензирование(Review), группа Изменения(Changes):
Разрешить изменение диапазонов
Это стандартный инструмент, для использования которого нет необходимости подключать что-то дополнительно и он относительно прост в использовании.
Данный инструмент позволяет назначить каждому отдельному диапазону ячеек свои пароли, диапазоны могут располагаться на разных листах книги или на одном листе:
Пример таблицы
Например, сотрудники коммерческого отдела в общем файле бюджета(картинка выше) должны иметь возможность заполнять только ячейки строк со статьями выручки (строки 8-11, 13-14), а производственный отдел строки 18-22, в которых расположены статьи по расходам производственного отдела. При этом сотрудники коммерческого отдела не должны иметь возможность изменять данные статей другого отдела – каждый только данные своих статей.
Для начала необходимо для сотрудников каждого отдела создать отдельные диапазоны, к которым они будут иметь доступ. Для этого переходим на вкладку Рецензирование(Review) -группа Изменения(Changes) -Разрешить изменение диапазонов(Allow Users to Edit Ranges). Появится диалоговое окно создания/изменения диапазонов:
Создание диапазонов
Нажимаем Создать(New). Появится другое окно, в котором необходимо указать имя диапазона(Title) (коммерческий), доступные для изменения ячейки(Refers to cells) (C8:N11;C13:N14) и вписать пароль(Range password) (1111):
Новый диапазон
После нажатия Ок появится окно подтверждения пароля. Необходимо указать тот же пароль, что был указан ранее для данного диапазона.
Примечание: если нажать на кнопку Разрешения(Permissions), то можно установить доступ без пароля для конкретных групп пользователей, если группы настроены политикой доменной сети.
Точно так же создаем второй диапазон – "производственный", но для него указываем другой пароль(например – 2222). После этого у нас в главном окне управления диапазонами будет два диапазона:
Просмотр диапазонов
Здесь можно еще раз проверить все ли правильно указано, при необходимости изменить (так же изменить диапазоны можно в любое время, вызвав данное окно с вкладки Рецензирование(Review) -Разрешить изменение диапазонов). После этого нажимаем Применить(Apply).
Теперь, чтобы такая защита сработала необходимо непосредственно защитить лист. Это можно сделать либо сразу из этого же окна, нажав кнопку Защитить лист, либо закрыв окно перейти на вкладку Рецензирование(Review) и в группе Изменения(Changes) выбрать Защитить лист(Protect sheet):
Параметры защиты листа
В появившемся окне проставляем галочки для тех действий, которые мы хотим разрешить делать пользователю на защищенном листе без ввода пароля(например, на картинке выше помимо стандартного выделения ячеек разрешена вставка столбцов. Подробнее про защиту листов и ячеек можно прочитать в статье - Защита листов и ячеек в MS Excel). Указываем пароль (например 3333), подтверждаем пароль в появившемся окне и нажимаем Ок. Лист защищен.

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

Теперь остается сообщить сотрудникам отделов их пароли: производственный - 2222, коммерческий – 1111.
При первой попытке изменить данные в ячейках C8:N11;C13:N14- будет запрошен пароль на изменение ячеек созданного диапазона "коммерческий" (1111):
Доступ к диапазону
Если пользователю известен пароль для диапазона – его необходимо будет ввести лишь один раз. В дальнейшем для ввода данных в ячейки этого диапазона вводить пароль не придется до тех пор, пока файл не будет закрыт. После повторного открытия файла пароль необходимо будет указать заново.
Однако, если сотрудник другого отдела попытается изменить ячейки производственного отдела и пароль ему неизвестен – изменить данные этих ячеек не получится.
Также ни сотрудники коммерческого отдела, ни сотрудники производственного отдела не смогут изменить данные столбцов А и В(№ и наименование статьи), заголовки таблицы(строки с 1-ой по 7-ю) и строки с итоговыми формулами (12, 15 и т.д. – закрашенные зеленым). Они смогут изменять только те ячейки, которые перечислены в назначенных каждому отделу диапазонах. Внести данные в другие ячейки(не перечисленные в разрешенных диапазонах) можно будет исключительно сняв общий доступ с книги, а после этого защиту с листа –Рецензирование(Review) -группа Изменения(Changes) -Снять защиту листа(Unprotect sheet). Но снять общую защиту сможет только тот, кто её создавал и кому известен "главный" пароль. Как правило это администратор или некий "смотрящий" файла и другие пользователи этот пароль не знают.
Плюс подобного метода в том, что такая защита может быть установлена для книги в общем доступе(подробнее про книги с общим доступом можно прочитать в статье - Ведение журнала сделанных в книге изменений).
Что необходимо учитывать для книг с общим доступом: создавать диапазоны для пользователей и устанавливать защиту на лист необходимо ДО назначения книге общего доступа, т.к. после того, как книге будет назначен общий доступ изменять параметры защиты листов и книги запрещено. При этом запрещены как установка защиты так и её снятие.
Минус данного метода в том, что нет дружественного интерфейса снятия защиты. Например, при попытке изменить какие-то ячейки одного из назначенных диапазонов нет никакой информации о том, что это за диапазон(коммерческий или производственный). Что в свою очередь может запутать пользователя. Так же данным методом невозможно скрыть листы, либо отдельные строки и столбцы. Можно лишь запретить изменение ячеек.



 
Разграничение прав доступа при помощи VBA
Самый большой минус всех методов ниже: они не будут работать при отключенных макросах(Что такое макрос и где его искать?). Во всех приложенных к статье файлах это предусмотрено и если макросы будут отключены, то пользователь увидит лист, предлагающий включить макросы. Подробнее см. в статье: Как запустить файл с включенными макросами?
Плюс подобного подхода - мы практически не ограничены в правилах: можем скрывать от отдельных пользователей любые листы, строки и столбцы, защищать отдельные ячейки и т.п. Я ниже приведу несколько вариантов реализации защиты кодами, а вам останется лишь выбрать тот, который больше подходит под задачу. Первые три больше демонстрационные, чтобы показать что можно сделать. А вот последний пример - Практический пример с использованием администратора - наиболее приближен к задачам, применяемым в работе и наиболее удобен для распространения среди пользователей.
Проект VBA во всех файлах открыт для просмотра и изменений. Однако перед распространением решений в реальности лучше его закрыть от просмотра и изменений - Как защитить проект VBA паролем.

Важно: приведенные ниже решения могут работать некорректно в книгах с общим доступом. А те решения, в которых устанавливается защита на листы вообще не будут работать, т.к. для книг с общим доступом невозможно изменять параметры защиты листов и книг.

  • Доступ пользователям только к определенным листам
    Исходная задача: дать возможность пользователю видеть и работать только на определенных листах - тех, которые мы ему выделили. При этом он даже не подозревает, что есть другие листы. Как работает. Открываем файл - автоматом отображается лишь один лист "Main", доступный всем пользователям, жмем на кнопку, появляется форма:

    В форме необходимо выбрать пользователя и указать пароль, соответствующий этому пользователю. Важно: Пароли и список доступных листов можно редактировать на очень скрытом листе "Users". Для каждого пользователя можно указать несколько листов. Указывать имена листов необходимо в точности такие же, какие они на самом деле. Это значит, что и регистр букв и каждый пробел должен быть учтен. Для разделения записей с несколькими листами используется точка-с-запятой(Лист1;Лист2;Лист3).
    На листе "Main" перечислены имена пользователей, пароли для них и доступные для просмотра листы. Данная информация указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе "Users".

    Важно: файл может работать нестабильно в книгах с общим доступом.

    Скачать пример

      Tips_Macro_Sheets_for_Users.xls (84,5 KiB, 11 168 скачиваний)

  • Доступ пользователю к определенным листам и возможность изменять только отдельные ячейки
    Помимо того, что можно ограничить пользователю свободу выбора листов, ему можно еще и ограничить диапазоны ячеек, которые ему разрешено изменять. Иначе говоря, человек сможет работать только на Лист1 и Лист2 и вносить изменения только в указанные для каждого из листов ячейки. Файл с примером работает так же, как и пример выше: открываем книгу - видим только один лист "Main", жмем кнопку. Появляется форма, выбираем пользователя. Появятся только разрешенные листы и на этих листах можно изменять только те ячейки, который мы разрешим в настройках. При этом диапазоны для изменения можно указать для каждого листа разные. Важно: Пароли, список доступных листов и диапазонов можно редактировать на очень скрытом листе "Users". Для этого его необходимо отобразить, как описано в статье: Как сделать лист очень скрытым.
    Чтобы разрешить изменять диапазоны на Лист1 - А1:А10 и А15:А20, а на Лист2 - В1:В10 и В15:В20, необходимо на листе "Users" указать листы: Лист1;Лист2 и диапазоны: A1:A10,A15:A20;B1:B10,B15:B20
    На листе "Main" пароли и фамилии указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе "Users".
    Пароль на листы указывается напрямую в коде. Для изменения пароля необходимо перейти в редактор VBA(Alt+F11), раскрыть папку Modules, выбрать там модуль sPublicVars и изменить значение 1234 в строке: Public Const sPWD As String = "1234":
    Сменить пароль на листы

    Важно: защита диапазонов достигается за счет установки защиты листа. Поэтому файл не будет работать в книгах с общим доступом.

    Скачать пример

      Tips_Macro_Sheets_Rng_for_Users.xls (86,0 KiB, 5 098 скачиваний)

  • Доступ к определенным листам и скрытие указанных строк/столбцов
    И еще чуть-чуть испортим жизнь пользователю: каждому пользователю видны только свои листы и виден только свой диапазон на этом листе. Точнее - строка или столбец. Все так же, как и в файлах выше(Пароли, список доступных листов и диапазонов можно редактировать на очень скрытом листе "Users". Для этого его необходимо отобразить, как описано в статье: Как сделать лист очень скрытым).
    На листе "Users" доступны следующие настройки: в самом правом столбце необходимо указать скрывать столбцы(C) или строки(R) указанного диапазона.
    Например, указаны диапазоны на Лист1 - А1:А10 и А15:А20, а на Лист2 - В1:В10 и В15:В20, а в правом столбце - R;C. Значит на Лист1 будут скрыты строки 1:10, 15:20, а на Лист2 столбец В. Почему так заумно? Потому что нельзя скрыть только отдельные ячейки - можно скрыть лишь столбцы или строки полностью.
    На листе "Main" пароли и фамилии указаны только для ознакомления и тестов. Менять данные для реальных задач необходимо на листе "Users".
    Пароль на листы указывается напрямую в коде. Для изменения пароля необходимо перейти в редактор VBA(Alt+F11), раскрыть папку Modules, выбрать там модуль sPublicVars и изменить значение 1234 в строке: Public Const sPWD As String = "1234":
    Сменить пароль на листы

    Важно: защита отображения скрытых строк и столбцов достигается за счет установки защиты листа. Поэтому файл не будет работать в книгах с общим доступом.

    Скачать пример

      Tips_Macro_Sheets_Hide_Rng_for_Users.xls (100,0 KiB, 4 770 скачиваний)

  • Практический пример с использованием администратора
    Все примеры выше имеют один маленький недостаток: при открытии файла виден один лист и надо жать на кнопку, чтобы выбрать пользователя. Это не всегда удобно. Плюс есть недостаток куда хуже: для изменения настроек всегда надо вручную отображать лист настроек, а может и другие листы. Поэтому ниже я приложил файл, форма в котором открывается сразу после открытия файла:
    Форма авторизации
    Если выбрать "Пользователь" - admin, указать "Пароль" - 1, то все листы файла будут отображены. Другим пользователям будут доступны только назначенные листы. Таким образом, пользователь, назначенный администратором сможет легко и удобно менять настройки и права доступа пользователей: добавлять и изменять пользователей, их пароли, листы для работы(они доступны на листе Users, как и в файлах выше). После внесения изменений надо просто закрыть файл - он сохраняется автоматически, скрывая все лишние листы.
    При этом если пользователя нет в списке или пароли ему неизвестны, то при нажатии кнопки Отмена или закрытии формы крестиком файл так же закроется. Таким образом к файлу будет доступ только тем пользователям, которые перечислены в листе Users, что исключает доступ к файлу посторонних лиц.
    Если макросы будут отключены, то пользователь увидит лишь один лист - с инструкцией о том, как включить макросы. Остальные листы будут недоступны.
    В реальных условиях не лишним будет закрыть доступ к проекту VBA паролем: Как защитить проект VBA паролем

    Важно: файл может работать нестабильно в книгах с общим доступом.

    Скачать пример

      Tips_Macro_UsersRulesOnStart.xls (72,0 KiB, 6 679 скачиваний)


Статья помогла? Поделись ссылкой с друзьями!
  Плейлист   Видеоуроки

Поиск по меткам

Access apple watch Multex Power Query и Power BI VBA управление кодами Бесплатные надстройки Дата и время Записки ИП Надстройки Печать Политика Конфиденциальности Почта Программы Работа с приложениями Разработка приложений Росстат Тренинги и вебинары Финансовые Форматирование Функции Excel акции MulTEx ссылки статистика
Обсуждение: 113 комментариев
  1. Владимир:

    Дмитрий здравствуйте.
    Спасибо за примеры. Очень полезным для меня оказался 1й пример с общим листом и возможностью далее выбирать пользователя.
    Но вот как сделать так, что бы на main лист переносилась информация со всех листов. Тобишь, нужно что бы все пользователи могли видеть информацию со всех листов, а уже используя кнопку, определёные пользователи вносят инфу согласно прописаным доступам. (Иванов лист1, Петров лист2, и т.д.)

    • Владимир, для этого надо писать отдельный код. Можете адаптировать под себя код из этой статьи: Как собрать данные с нескольких листов или книг?

      • Владимир:

        Отлично, примерно то что мне нужно, но вот как убрать пустые ячейки.
        так как с нескольких документов он добавляет и заполненные ячейки и пусты.
        Получается между перенесённой информацией с нескольких листов, много пустых ячеек и нужно листать в низ, что бы увидеть информацию с другого файла.
        Не удобно, когда 10 файлов

        • Могу посоветовать Вам только почитать комментарии на странице с кодом - вопрос уже поднимался, я давал когда-то на него ответ. Надо определять последнюю заполненную ячейку по конкретному столбцу.

          • Владимир:

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

  2. Владимир, может будете комментарии создавать для тех статей, в которых что-то непонятно? Я тогда хотя бы ответить смогу. Вот сейчас как понять про какое форматирование речь, если комментарий Вы создали в теме про разграничение диапазонов и листов пользователям и никакое форматирование здесь вообще не затрагивается? Или Вы решили здесь ветку своих личных вопросов создать? :)

  3. Гузалия:

    Есть необходимость реализации подобной задачи.
    Не удается разобраться в коде.

    Есть рабочий файл, который заполняет ответственный человек в организации.
    Он должен видеть 4 листа. Менеджер: 2 листа. А есть учредители/руководители. Они должны видеть эти 4 и еще 7 листов. Причем количество пользователей и листов может изменяться, как и их названия.
    Можно сделать три роли: Управляющий, Учредитель.
    Файл расположен на Яндекс.Диске, то есть к нему есть доступ к разных людей.

    При необходимости могу файл скинуть.

    Как сделать так, чтобы

    Ранее с макросами не работала.
    Вот этот код то работает, то не работает.
    Private Sub Workbook_Open()
    If Application.UserName = "Guzalia Nurieva" Then
    Worksheets("Статистика").Visible = True
    Worksheets("Справочник_рук").Visible = True
    Worksheets("ДиР пансионата").Visible = True
    Worksheets("Учет ДиР_общее").Visible = True
    Worksheets("ДиР КЦ").Visible = True
    Worksheets("ДиР КД и КЦ").Visible = True

    Else:
    Worksheets("Статистика").Visible = xlVeryHidden
    Worksheets("Справочник_рук").Visible = xlVeryHidden
    Worksheets("ДиР пансионата").Visible = xlVeryHidden
    Worksheets("Учет ДиР_общее").Visible = xlVeryHidden
    Worksheets("ДиР КЦ").Visible = xlVeryHidden
    Worksheets("ДиР КД и КЦ").Visible = xlVeryHidden
    End If

    End Sub

  4. Андрей:

    в файле "ДОСТУП К ОПРЕДЕЛЕННЫМ ЛИСТАМ И СКРЫТИЕ УКАЗАННЫХ СТРОК/СТОЛБЦОВ" при смене пользователя остаются видны листы предыдущего пользователя, как это можно исправить?

    • Андрей, спасибо. Заменил файл, теперь все корректно скрывается и отображается.

      • Андрей:

        ничего не поменялось, все равно остаются открытые листы

      • Андрей:

        Дмитрий, спасибо, теперь все работает, единственное не могу вставить готовые листы туда, выдает ошибку(Run-time error '1004':
        Нельзя установить свойство Hidden класса Range) подскажите как с этим бороться,пожалуйста.

  5. Ира:

    не могу разобраться.
    что нужно сделать что бы увидеть код макроса?

  6. Роман:

    Добрый день!
    Огромное спасибо за статью и проделанную работу!!!!
    Но возникла потребность взять часть функции из примера 1 (ограничение в диапазоне вносимых данных для каждого пользователя) и поместить в пример 3. Помогите разобраться как это сделать. Заранее премного благодарен.

    • Роман:

      Прошу прощения, перепутал номера примеров.
      Необходимо из Tips_Macro_Sheets_Rng_for_Users взять функцию ограничения в диапазоне вносимых данных для каждого пользователя и внести её в Tips_Macro_UsersRulesOnStart.
      Спасибо

  7. Антон:

    Не могу сменить пароль на защиту листа... При любом изменении потом выдаёт ошибку. И заново листы создавал, и защиту снимал, и ставил вручную защищённые листы с нужным паролем... Подскажите что делать!? Пожалуйста!

    • Антон, а какое отношение это имеет к данной статье? В упор не пойму где чего пытаетесь менять. Для пароля к листам в кодах есть прям отдельная инструкция со скринами где этот пароль надо менять на свой. Опишите подробнее какой прием используете, где чего и как пробуете менять.

  8. Елена:

    Дмитрий, здравствуйте. У нас также возник вопрос конфиденциальности информации в отчете. Говорят пароли в Excel легко снимаются. Относится ли данное утверждение к описанному в статье примеру пароля для пользователя через Администратора?

  9. Валерий:

    Добрый день Дмитрий!
    Спасибо за предоставленные примеры!
    Возможно ли пример Tips_Macro_UsersRulesOnStart.xls доработать так, чтобы в нем содержались те функции и свойства, которые есть в других примерах:
    1. Работа пользователя только на заданных диапазонах ячеек, как в примере Tips_Macro_Sheets_Rng_for_Users.xls
    2. Скрытие от пользователя заданных строк и/или столбцов, как в примере Tips_Macro_Sheets_Hide_Rng_for_Users.xls
    Прошу помочь, у меня, к сожалению не получилось доработать код примера Tips_Macro_UsersRulesOnStart.xls чтобы тот стал универсальным и полным по функционалу.
    Спасибо большое!!

  10. Сергей:

    Добрый день,
    Интересовала возможность запаролить листы - чтобы в Общем файле каждый менеджер видел только доступную для него информацию (свой лист).
    Решил применить последний пример, но оказалось, что эта защита - только бутафория. Т.е. не заполняя поля "Пользователь" и "Пароль", я могу добавить новый лист, создавая лист 2 раза - по автоматическому названию листа я вижу, что у меня появился лист1 и лист4, т.е. понятно что есть где-то лист2 и лист3. В новом листе1 прописываю в ячейке А1 ссылку на А1 в скрытом листе2, протягиваю - и вуаля, вся информация со скрытого листа2 у меня перед глазами.
    Вы скажете, так у тебя будут другие названия листов - хорошо, какие они могут быть - чтобы были понятными и читаемыми? Правильно, либо фамилии менеджеров, либо менеджер1/2/3 - в общем по аналогии с названием доступного мне листа.
    Понятно, что все можно взломать, но в данном случае все эти макросы не достигают поставленной цели - любой любознательный менеджер сможет методом несложной аналитики и подбора вытащить всю информацию.
    Даже если прописать запрет на добавление новых листов и выделение любых ячеек - по тому же принципу можно вытащить всю информацию в отдельную книгу, без выделения ячеек, просто прописав правильно ссылку на любой скрытый лист.
    Может я не прав? Можно как-то решить этот момент?
    А в общем, спасибо за Вашу работу, очень много полезной информации.

    • Сергей, Ваши замечания не совсем верны. Названия листов могут вообще не совпадать с именами менеджеров - это уже на свое усмотрение. И при правильном подходе даже любознательный менеджер замучается подбирать имя листа по аналогии с чем-то вроде ""Иванов_50264", где 50264 некий уникальный ID для каждого менеджера. Любознательный менеджер быстрее взломает проект VBA :)
      К тому же мой пример носит лишь ДЕМОНСТРАТИВНЫЙ характер и каждый может подправить под свои нужды и ограничения, со своими нюансами. Более того - знаю, что это решение успешно работает в нескольких компаниях и пока никто не жаловался.
      А взломать можно все - к подобным задачам надо подходить не с точки зрения "чтобы никто не добрался", а с точки зрения "удобство". VBA вообще никогда не славился нормальной защитой, поэтому и не стоит от решений на его базе ожидать чудес в области защищенных решений.

Поделитесь своим мнением

Комментарии, не имеющие отношения к комментируемой статье, могут быть удалены без уведомления и объяснения причин. Если есть вопрос по личной проблеме - добро пожаловать на Форум


Для оформления сообщений Вы можете использовать следующие тэги:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Тренинги

Заказать
Юридическая информация

Использование материалов сайта

Политика Конфиденциальности

ИП Щербаков Дмитрий Валентинович
ОГРНИП: 318502700083307
ИНН: 504013350772

Наши партнеры

Перейти

Счетчики

Рейтинг@Mail.ru Яндекс.Метрика
© 2024 Excel для всех   Войти