Выборочное отображение листов пользователям
Довольно часто при совместной работе возникает ситуация, когда неплохо бы знать имя пользователя, который работает сейчас с файлом. Это позволит, например, поприветствовать человека по имени в диалоговом окне или, наоборот, ограничить его доступ к данным, если его имя не входит в разрешенный список и т.д.
Классический способ определения имени заключается в использовании очевидного свойства UserName объекта Application:
Sub Hello_1() MsgBox "Привет, " & Application.UserName End Sub
Выполнение такого макроса приведет к появлению простого окна сообщения с приветствием:
Неплохо, несложно, но есть одно "но". В качестве UserName макрос берет имя пользователя, которое введено в поле Пользователь в параметрах Excel Файл - Параметры - Пользователь (File - Options - User):
Засада в том, что это имя любой пользователь у себя на компьютере может в любой момент свободно поменять на любое другое. А у корпоративных пользователей там, зачастую, при установке Office автоматически прописывается какой-нибудь безличный "user".
Чуть более сложным, но гораздо более надежным способом, будет брать не имя пользователя из параметров Excel, а логин входа в Windows. Его поменять уже не так легко и, для большинства пользователей, он уникален в пределах локальной сети компании.
Чтобы считать его нам потребуется использовать малоизвестную функцию VBA Environ, которая выдает информацию о различных параметрах операционной системы и Office на текущем компьютере. Аргумент USERNAME заставит эту функцию считать логин пользователя в Windows, под котороым сейчас произведен вход в компьютер:
Sub Hello_1() MsgBox "Привет, " & Environ("USERNAME") End Sub
Таким образом, несложно организовать с помощью простого макроса, своего рода защиту при открытии файла - если книгу открывает не тот человек, то ему не показываются определенные листы с приватной информацией или промежуточными вычислениями. Если открыть редактор Visual Basic (Alt+F11) и затем двойным щелчком открыть в левом верхнем углу модуль ЭтаКнига (ThisWorkbook), то туда можно вставить макрос обработки события открытия книги, который и будет выполнять эту функцию защиты:
Private Sub Workbook_Open() If Environ("USERNAME") <> "Nikolay" Then 'если логин пользователя не Nikolay Worksheets("Лист1").Visible = False 'скрываем Лист1 Worksheets(3).Visible = xlVeryHidden 'делаем 3-й лист суперскрытым Else For i = 1 To Worksheets.Count 'в противном случае Worksheets(i).Visible = True 'проходим в цикле по всем листам Next i 'и делаем их видимыми End If End Sub
Теперь все листы будут видны только пользователю с именем (логином) Nikolay, а для всех остальных из трех листов книги будет виден только второй. Простор для применения этой функции широкий - пользуйтесь ;)
Ссылки по теме
- Как сделать лист в книге Excel суперскрытым
- Что такое макросы, куда и как вставлять код макросов на VBA
Хочу дополнить ссылкой на свою -
Вдруг кому пригодится. У меня немного иной подход применен. Имя пользователя не берется с учетной записи ПК, а выбирается из списка, определенного ответственным за файл человеком. Каждому пользователю определен свой пароль. Помимо листов можно разрешить изменять только указанные диапазоны, а так же разрешить видеть только определенные строки и столбцы.
Буквально,
А куда именно добавлять блоки If - End If ?
Что-то у меня не выходит...
Добавила следующим образом, но тогда у меня листы видят все:
Попробовала перевернуть условия тогда у меня User Olga не видит нужные листы:
Пробовала делать через OR
Та же фигня ...
Private Sub Workbook_Open()
MsgBox "Привет, " & Environ("USERNAME")
End Sub
Одновременное редактирование более-менее нормально реализовано только в Excel 2016, причем в файлах, хранящихся в облаке (OneDrive). Но права для пользователей на разные листы и там нельзя ставить.
Так что вариант тут только один: давать разным пользователям разные файлы, а потом собирать их в одно место
Я, возможно, что то неправильно понял, но скачав пример и поменяв в нем имя на свое, я столкнулся с тем, что если у человека отключены макросы в EXCEL, то он при открытии файла видит все листы.
Если потом он нажимает на кнопку активации макросов, то листы скрываются, но если это предупреждение закрыть (нажав крестик) то листы остаются видимыми.
Так и должно быть?
Тогда, если макросы не разрешены, то скрытые листы останутся скрытыми, а видимыми их может сделать только макрос (который пользователь вынужден будет разрешить).
If Environ("USERNAME";) <> "Nikolay" Then 'если логин пользователя не Nikolay
Спасибо!!!
ПыСы. Возможно я туплю, но ввиду своего скудоумия ,в этих табличных делах, вынужден задавать подобные вопросы. Дабы расширь свой кругозор.