Форма авторизации для проектов VBA

Назначение формы авторизации

Форма авторизации предназначена для разграничения прав пользователей при работе с документами Office, содержащими макросы.

 

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

 

Программа допускает создание неограниченного числа пользователей, каждый из которых принадлежит к одной из следующих групп:
пользователь, уверенный пользователь, администратор, разработчик.
(количество групп при желании можно легко увеличить до 9999)

При первом запуске формы (или после того, как вы залогинитесь под правами администратора) становится доступной кнопка добавления и редактирования списка учётных записей.

Для вызова формы авторизации используется функция GetNewAL, которая возвращает выбранный пользователем уровень доступа.

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

Sub Main()
    If AL = AL_DEVELOPER Then Exit Sub    ' этот макрос не надо запускать под учёткой разработчика
    
    If AL < AL_ADMINISTRATOR Then    ' пользователь, или уверенный пользователь
        
        MsgBox "У вас недостаточно прав для выполнения этого действия", vbExclamation, "Недостаточно прав"
 
        ' предоставляем пользователю возможность ввести учётные данные администратора
        If GetNewAL >= AL_ADMINISTRATOR Then
            ' ваш код (пользователь залогинился как "администратор")
        End If
 
    End If
End Sub

Пароль на проект VBA: 1 (единица)

Вложения:
AuthForm.zip57.29 КБ

Комментарии

Настройки просмотра комментариев

Выберите нужный метод показа комментариев и нажмите "Сохранить установки".

Добрый день!
Как сделать чтобы скрывались те листы, если недостаточный уровень доступа

Здравствуйте. Когда я зашёл в форму авторизации мне не выдало кнопку добавления пользователей. Что делать?

Прошу у вас помощи!
На стене уже был вопрос о том, что при закрытии файла с сохранением - все листы становятся видны в следующий раз. А код из 4 строчек, который вы указали выше - не помогает. Этот изъян остается.
Добавил этот код, но он не срабатывает.Прошу вас, помогите с этим моментом

Код открыт, - меняйте под свои нужды как угодно.
Техподдержки по бесплатным макросам нет.
Хотите готовое решение, - можем сделать под заказ.

Добрый день.
Скажите, как сделать что бы при авторизации открывались только те листы которые разрешены для просмотра.

Добрый день!
Дописал строки, чтобы скрывались листы, если недостаточный уровень доступа. Но они скрываются только при первой авторизации после запуска книги. Если же потом запустить макрос "Выход" и войти с тем же уровнем доступа, то доступны уже все листы. Подскажите, как это можно исправить?
Спасибо!

При нажатии кнопки ВХОД, сохраняйте в глобальную переменную значения из текстовых полей «логин» и «пароль»,
а потом используйте их в коде

If GetNewAL >= AL_USER Then
   MsgBox "Приветствую вас, " & UserName, vbInformation
   ИзменитьВидимостьЛистов True
End If

Или вывести логин и пароль залогинившегося пользователя на определенный лист.

Добрый день.
Как в этом коде:

Private Sub Workbook_Open()
' предоставляем пользователю возможность авторизоваться
If GetNewAL >= AL_USER Then
MsgBox "Приветствую вас, логин", vbInformation <--- в этом месте отображался бокс с логином пользователя "Приветствую Вас, Вася Пупкин"
ИзменитьВидимостьЛистов True
End If

If AL >= AL_ADMINISTRATOR Then ' (пользователь залогинился как "администратор")
MsgBox "Приветствую Вас, Администратор", vbInformation
End If
End Sub

Спасибо.

Там всё сделано под пару логин-пароль
Если оставить только логин (или пароль) - много переделывать надо
(потому, подсказать не смогу, - работы много по переделке)
Код открыт, - можете сами доработать под свои нужды

Подскажите пожалуйста как вывести только логин.

1) программа (в виде файла Excel) не устанавливается
2) ATPVBAEN.xlam и FUNCRES.XLAM - это надстройки, которые идут вместе с Excel/
Они у вас были там и до запуска моей программы
(или же вы их активировали, поставив галочки в окне подключения надстроек)

Установил программу "Форма авторизации для проектов VBA". Теперь в редакторе не могу избавиться от atpvbaen.xls(ATPVBAEN.xlam) и VBAProject(FUNCRES.XLAM).

Аккаунты хранятся в пользовательских свойствах файла:
http://excelvba.ru/code/CustomDocumentProperties

Вывести на лист все аккаунты можно таким кодом:

Sub test()
    On Error Resume Next:   arr = AllAccountsArray(ThisWorkbook)
    Worksheets.Add.Cells(1).Resize(UBound(arr, 1) + 1, UBound(arr, 2) + 1).Value = arr
End Sub

На листе получится таблица из 4 столбцов:
1 - индекс
2 - логин
3 - пароль
4 - уровень доступа

здравствуйте, где хранятся данные о пользователях (если их в базе больше 100), и как вывести их в нужную ячейку?

Наверное, потому, что на компе не установлен русский языковой пакет.

У меня (и у всех, кто пользовался этой программой), всё корректно отображается.

И почему не отображается русские буквы в выпадающем списке логина?

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

Какая информация? Логины и пароли?
Так они не в реестре хранятся, а в свойствах файла Excel.

В реестре только ставится отметка после первого запуска файла (для отключения кнопки редактирования учетных записей, при втором и последующих запусках файла)
Это вы сами сможете убрать в коде (я уже не помню, зачем я так сделал, - потому лучше это дело удалить)

А есть возможность, чтобы информация не в реестр записывалась, а например в отдельный файл или скрытый лист?

А как вы его удалите, если список пользователей доступен для изменения только при первом запуске файла?

Ну а если пользователь успешно авторизовался под максимальным уровнем доступа - зачем ему запрещать изменять\удалять свою учетную запись?

PS: Что конкретно изменить - так сразу не могу сказать.
Код писал давно, и уже плохо понимаю, что и как там сделано.
Поглядел код - многое дорабатывать надо (добавлять проверки в процедуры DeleteAllAccounts и DeleteAccount, предварительно вычисляя уровень доступа для текущей учетной записи)

Здраствуйте. Что нужно дописать,чтобы пользователя с АL=9 нельзя было удалить ? Спасибо.

спасибо большое! очень интересные проекты!!!!!!!!

Александр, пароль можно было легко найти, прочитав все комменты к статье.
На всякий случай, добавил пароль и в текст статьи.

Извините а не подскажете, а какой пароль на проекте vba?

Если привязать например к столбцу L, в котором будет ФИО ответственного (оно же его логин). Только как...

Как реализовать - не подскажу.
На форумах однажды видел подобное - там очень много кода, много ограничений на работы макроса
(например, если файл в общем доступе, то работать не будет, если макросы выключены - тоже работать не будет)
Чтобы учесть все нюансы - придётся написать ОЧЕНЬ много кода.
Я бы за такое не взялся. И вам не советую (если только вы не хотите посвятить свою жизнь изучению программирования на примере этой задачи)

Макросов для сбора данных из книг - множество, в том числе и у меня на сайте.
Google вам поможет из все найти. Сможете их адаптировать под своб задачу, или нет, - зависит от структуры таблиц в ваших файлах.
Если наделаете там кучу украшательств - типа объединённых ячеек, пустых строк и столбцов, промежуточные заголовки, и т.д. - то будет сложновато.
Если же сделаете нормальные таблицы - то с макросом проблем не возникнет.

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

RALF, реализовать это весьма сложно.
Excel не предназначен для такого (хотя, в Excel 2013, что-то подобное вроде есть)

Проще сделать несколько файлов (отдельные книги Excel для каждого пользователя),
а потом макросом собирать информацию из этих файлов в один.

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

Обалдеть!...

Это вы задаёте настройки для прав доступа макросов.

Т.е., например, макрос проверяет уровень доступа, и, если он равен 1, сообщает пользователю, что он не имеет права что-то там делать,
а если уровень доступа больше 5, - то выполняет действие без предупреждения.
Как-то так.
Это всё никак не сказывается на встроенном функционале Excel.

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

В коде есть строка AL_GUEST = 1
Создал пользователя с доступом 1.
Но он все равно может изменять документ, чего не должно происходить. Ведь он гость и не должен иметь права на редактирование документа.
Как-то возможно разрешить этот момент?
Спасибо.

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

Private Sub Workbook_Open()
    ' предоставляем пользователю возможность авторизоваться
    If GetNewAL >= AL_USER Then
        ' ваш код (пользователь удачно залогинился)
        ИзменитьВидимостьЛистов True
    End If
 
    If AL >= AL_ADMINISTRATOR Then    ' (пользователь залогинился как "администратор")
        MsgBox "Приветствую вас, Администратор", vbInformation
    End If
End Sub

Если вы задали константу AL_USER>1, то при AL = AL_GUEST = 1 условие не выполнится, и листы не будут отображены...

Напишите так:

If GetNewAL > 0 Then
        ' ваш код (пользователь удачно залогинился)
        ИзменитьВидимостьЛистов True
    End If

или

If GetNewAL >= AL_GUEST  Then
        ' ваш код (пользователь удачно залогинился)
        ИзменитьВидимостьЛистов True
    End If

или так:

If GetNewAL > AL_UNKNOWN  Then
        ' ваш код (пользователь удачно залогинился)
        ИзменитьВидимостьЛистов True
    End If

Странно, при гостевом доступе AL_GUEST = 1 не отображаются скрытые страницы. Хотя вроде как гость должен иметь право на их просмотр, но не редактирование.

Только я не стал дописывать эти две строки:...

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

Если 9 - это разработчик, 3 - администратор, 2 - уверенный пользователь и 1 - пользователь, то зачем нужны 4,5,6,7 и 8?

Названия именованным константам даны лишь для примера.
Вам ничто не мешает присваивать переменной AL любые значения (любые числа от -дофига до +дофига), без оглядки на константы.
Например, AL = 55, или AL = -48

Или же, для удобства использования в коде, изменить константы как угодно:

Public Enum AccessLevels
    AL_UNKNOWN = 0
    AL_GUEST = 1
    AL_USER = 15
    ADMINISTRATOR = 777
    AL_ROOT = 1000
    DUMMY = -666.6
End Enum

И еще. В настройках доступа пользователей присутствует диапазон от 1 до 9. А в аннотации к файлу указаны только четыре группы: пользователь, уверенный пользователь, администратор и разработчик. Если 9 - это разработчик, 3 - администратор, 2 - уверенный пользователь и 1 - пользователь, то зачем нужны 4,5,6,7 и 8? В принципе указанных четырех групп более чем достаточно и на этот вопрос можно не отвечать. Только вот еще хотелось бы создать группу 0 или -1, не важно. Это гостевая группа с доступом только для просмотра документа, но с обязательным вводом пароля. Есть такая возможность?

Спасибо. Только я не стал дописывать эти две строки:
MySave ' принудительно сохраняем файл
ThisWorkbook.Saved = True
Это для того чтобы оставить выбор при выходе в крестик сохранять или нет, а то сразу сохраняет и выходит из документа без предупреждения.

Можно попробовать добавить такой код в модуль книги:

Private Sub Workbook_BeforeClose(Cancel As Boolean) ' перед закрытием файла
    AL = AL_UNKNOWN ' обнуляем уровень доступа
    MySave ' принудительно сохраняем файл
    ThisWorkbook.Saved = True
End Sub

Исправленный файл можно загрузить по ссылке http://excelvba.ru/XL_Files/Sample__18-12-2011__14-51-50.zip

Игорь, спасибо. Нужная вещь.
Есть одно замечание. Сразу скажу что использую Excel 2010. Так вот, если выходить из документа в крестик с сохранением, а не через кнопку "Выход", то при следующем запуске становятся видны все страницы, которые должны быть скрытыми, и полностью позволяют себя редактировать и без ввода пароля. Как бы избежать этого?

Игорь, подскажи, как присвоить листу уровень доступа?

Да, действительно, я когда качнул архив, сначала попробовал открыть файл прямо из него. Окошко для управления паролями появлялось.
Мне, вроде, понравилось. С трудом вышел без сохранения (открыто-то ведь было из архива).
Решил файл из архива вытащить и положить к себе в копилку. Тут-то при очередном его открытии и выяснилось, что управлять правами я больше не могу. А оказывается, что при первом запуске запись в реестр внеслась...
А как же мне по ходу юзания права редактировать, если я кнопочки для этого больше не увижу?
Но вообще-то идея с записями в реестр мне не нравится. Не хочу чтобы там мусор копился (а после удаления файла запись о нем в реестре становится мусором).
Может, не в реестр запоминать, а в ThisWorkbook.CustomDocumentProperties ?

Что-то у меня на начальную форму при первом запуске не выходит...

А, может, вы когда-то уже запускали этот файл у себя на компе?
Вот что я вижу при открытии: http://ExcelVBA.ru/pictures/20110704-p4l-51kb.jpg

Дело в том, что при первом запуске программа делает запись в реестре.
Обратите внимание на эту функцию:

Function FirstRun() As Boolean
    FirstRun = GetSetting(Application.Name, "Authentication", WORKBOOK_ID, "") = ""
End Function

и на эту константу:
Const WORKBOOK_ID = "123456"

В реестре появляется запись, что книга "123456" уже запускалась, и при следующем её открытии вы уже не увидите кнопки добавления (редактирования) учётных записей):
http://ExcelVBA.ru/pictures/20110704-1pg-43kb.jpg


Выяснил недостаток: Login - Case Sensitive - не удобно, т.к. обычно - нет.

Это не баг, это фича ))
Хотите изменить - просто добавьте директиву

Option Compare Text

первой строкой в модуль modAuth (но тогда и пароль перестанет быть чувствительным к регистру)

Лучше внести изменения в код проверки логина и пароля - чтобы только логин был нечувствительным:

Function CheckAccount(ByVal Login As String, ByVal Password As String) As AccessLevels
    ' проверяет имя пользователя и пароль среди аккаунтов, сохранённых в файле
    ' если такая учётная запись присутствует, функция возвращает уровень доступа
    On Error Resume Next
    arr = AllAccountsArray(ThisWorkbook)
    For i = LBound(arr) To UBound(arr)
        If UCase(arr(i, 1)) = UCase(Login) And arr(i, 2) = Password Then
            CheckAccount = arr(i, 3): Exit Function
        End If
    Next i
End Function


Ещё: не могу закрыть файл. Жму крестик. Отвечаю "сохранить". Прога думает 0,5 сек. и опять спрашивает "Сохранить?". И так, пока не откажусь.

А вы не отказывайтесь)))
Решить проблему можно, немного изменив код в модуле книги:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    ' запрещаем сохранение файла под другим именем
    If Not SaveAsUI Then MySave Else Cancel = True        ' отменяем встроенную команду сохранения файла
End Sub


Прикрепил к статье исправленный файл.

Что-то у меня на начальную форму при первом запуске не выходит...
Сразу - на запрос логина-пароля.
Только, забравшись в код, смог войти с супер-правами как EducatedFool и изменить логин-пароль.
Выяснил недостаток: Login - Case Sensitive - не удобно, т.к. обычно - нет.
Ещё: не могу закрыть файл. Жму крестик. Отвечаю "сохранить". Прога думает 0,5 сек. и опять спрашивает "Сохранить?". И так, пока не откажусь.

Блин офигенная штука, спасибо что расщедрился!!!!

Изначально никаких пар "логин-пароль" в файле не прописано.

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

Пароль на проект VBA: 1 (единица)

а пароль какой с логином?

Отправить комментарий

Содержание этого поля является приватным и не предназначено к показу.
CAPTCHA
Подтвердите, пожалуйста, что вы - человек:
  _____   ____   __     __ __   __         __  __
|___ / | __ ) \ \ / / \ \ / / __ _ \ \/ /
|_ \ | _ \ \ \ / / \ V / / _` | \ /
___) | | |_) | \ V / | | | (_| | / \
|____/ |____/ \_/ |_| \__,_| /_/\_\
Введите код, изображенный в стиле ASCII-арт.

Не получается применить макрос? Не удаётся изменить код под свои нужды?

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