Vba excel пароль на ввод

Авторизация в Excel на VBA: создание формы, написание программного кода, особенности реализации.

В этой статье я расскажу вам о создании формы авторизации в Excel с помощью VBA.

Что же представляет из себя авторизация в Excel? Это форма, то есть окно, с запросом ввода логина и пароля, при успешном вводе которых, пользователю будут открываться различные листы документа, в зависимости от группы доступа пользователя. Точно также, помимо открытия листов, можно будет выставить ограничения на действия в Excel: запрет форматирования ячеек, удаление строк, столбцов, использование фильтров, объектов, сценариев и так далее. Но обо всем по порядку.

Авторизация в Excel: основной алгоритм работы

Для начала, необходимо разработать алгоритм, по которому мы будем работать, и выглядеть он будет примерно так:

Авторизация на VBA: алгоритмИтак, поехали!

Авторизация в Excel: макет документа

Наш рабочий документ будет состоять из четырех листов:

  1. Лист с приветствием — единственный лист, который будет отображаться всем пользователям до авторизации
  2. Лист с дашбордом (визуализированным отчетом) — графики, диаграммы/гистограммы — изначально со свойством VeryHidden*
  3. Лист с данными — источник расчетов для дашборда  — изначально со свойством VeryHidden
  4. Служебный/технический лист — для хранения логинов, паролей и служебной и вспомогательной информации  — также, со свойством VeryHidden

*VeryHidden— свойство листа, при котором сам лист скрыт и включить его отображение можно только через использование режима разработчика. Для выбора данного свойства, необходимо в Excel зайти в меню «Разработчик» — «Visual Basic». Далее, необходимо выбрать нужный нам лист и в его свойствах («Properties») найти свойство Visible и установить в «2 — xlSheetVeryHidden».

Авторизация на VBA: свойство VeryHiddenПосле этого лист станет «очень скрытым». Отменить свойство VeryHidden можно точно так же через режим разработчика, либо используя необходимый нам макрос, о котором я напишу чуть дальше.

Авторизация в Excel: группы доступа

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

  1. Администраторы (Admin): доступны все листы , в том числе служебный, а также отсутствуют какие-либо ограничения.
  2. Руководители и ответственные за данные (Head): доступны 2 рабочих листа + стоит пароль на изменение структуры книги.
  3. Рядовые сотрудники компании (Worker): доступен только 1 рабочий лист с дашбордом + стоит пароль на изменение структуры книги.
Авторизация в Excel: разработка макета формы

С этим пунктом не должно возникнуть никаких проблем. Элементов на форме авторизации должно быть не так уж и много:

  • Поле ввода для логина
  • Поле ввода для пароля
  • Кнопка «Авторизация» (проверка логина и пароля)
  • Различные подписи на форме
  • По желанию: кнопка закрытия формы, кнопка восстановления пароля, логотипы, справка и все, что душе угодно

Для тех, кто не знает, как создавать формы в VBA: нужно зайти в меню «Разработчик» — «Visual Basic», нажать правой кнопкой по нашему проекту (VBAProject Название_Файла.xlsx), затем Insert — UserForm. Создается форма с названием UserForm1, на которой мы и будем размещать все наши объекты с помощью меню «ToolBox».

Если быстро набросать элементы, которые мы перечислили, должно получиться что-то вроде этого:

Авторизация на VBA: форма авторизации

После добавления элементов, поменял их стандартные названия:

«UserForm1» переименовал в «Authorization».
«TextBox1» переименовал в «TextBox_Login».
«TextBox2» переименовал в «TextBox_Pass». 

Также, в свойствах «TextBox_Pass», мы находим свойство «PasswordChar» и вводим любой символ, который мы хотим видеть вместо вводимых символов пароля — чаще всего используется символ «*».

Ничего лишнего, пока что все просто. Переходим далее.

Подготовка служебного листа

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

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

Авторизация на VBA: служебный лист

Авторизация в Excel: особенности и написание программного кода на VBA

Данные пункты тесно взаимосвязаны между собой, поэтому я их объединил в один большой. Здесь мы будем писать программный код для всего нашего файла: как для формы, так и для некоторых событий.

Для начала, мы напишем код, который будет отображать различные листы в зависимости от роли пользователя после авторизации. Макрос user_group мы делаем приватным и вписывать его будем не в отдельный модуль, а в нашу готовую форму Authorization. Аргументом для макроса является переменная X, которая будет содержать название группы доступа в виде текстовой строки String:

Private Sub user_group(ByVal X As String)
Dim Sht As Worksheet 'создаем переменную типа Рабочий Лист

ActiveWorkbook.Unprotect "112" 'Снимаем защиту структуры книги паролем

For Each Sht In ThisWorkbook.Sheets 'перебираем все листы книги
    If (X = "Admin") Then Sht.Visible = -xlSheetVisible 'если роль Admin - каждый лист будет видимый
    If (X = "Head") And (Sht.Name <> "Settings") Then Sht.Visible = -xlSheetVisible 'если роль Head - видны все, кроме Settings
    If (X = "Worker") And (Sht.Name = "Dashboard") Then Sht.Visible = -xlSheetVisible 'если роль Worker - виден только Dashboard
Next Sht

'если роль либо Head, либо Worker - ставим защиту на структуру книги с паролем "112"
If (X = "Head") Or (X = "Worker") Then ActiveWorkbook.Protect Password:="112", Structure:=True, Windows:=False

End Sub

Хочу обратить внимание на то, что у нашего файла будет стоять «защита структуры книги» с паролем «112», т.е. пользователь не сможет создавать, удалять и переименовывать листы нашего документа. И, чтобы изменить видимость листов, необходимо сначала снять эту защиту программно, а затем, в зависимости от роли пользователя, поставить обратно, что мы и делаем в нашем коде.

Далее, код для кнопки «Авторизация». При нажатии на данную кнопку, запускается несколько проверок:

  • Проверка полей логина и пароля заполнение: если одно из них не заполнено — выводится уведомление, выполнение макроса прекращается.
  • Проверка переменной Check: данная переменная хранит значение «некорректных» попыток входа. Ее необходимо объявить в основном модуле книги: Public check As Integer. Если данная переменная больше 3х — доступ к авторизации в текущей сессии блокируется.
  • Поиск и проверка логина на наличие на листе «Settings». Если логин найден — введенный пароль хешируется и сравнивается с хранимым хешем на соответствующей строке логина:
    • Если все корректно — запускается макрос User_Group, который открывает доступ к листам в зависимости от группы доступа, соответствующей логину.
    • Если данные некорректные — пользователь предупреждается об этом, а также наращивается счетчик некорректных попыток авторизации.
  • В оставшемся случае (все введено, но пользователь с таким логином не найден), пользователь также уведомляется.
Private Sub CommandButton1_Click()
If (TextBox_Login = "") Or (TextBox_Pass = "") Then 'предупреждение на заполнение полей логина/пароля
    MsgBox "Не введен логин или пароль!", vbInformation + vbOKOnly, "Внимание!"
    Exit Sub
End If

If (check > 3) Then 'проверка на количество паролей, введенных некорректно
    MsgBox "Вы ввели неверный пароль больше трех раз. Доступ к файлу заблокирован!", vbCritical + vbOKOnly, "Внимание"
    Exit Sub
End If

LastRow = Sheets("Settings").Cells(Rows.Count, 1).End(xlUp).Row 'проверка списка логинов
For i = 2 To LastRow
    If TextBox_Login = Sheets("Settings").Cells(i, 1) Then 'если логин найден
        If Sheets("Settings").Cells(i, 2) = GetHash(TextBox_Pass.Value) Then 'пароль хешируется и сравнивается с хранимым хешем
            user_group Sheets("Settings").Cells(i, 3).Value 'и если все ок - запускается макрос разграничения групп доступа
            Unload Authorization
            Exit Sub
        Else 'в противном случае - уведомление о неправильном пароле
            MsgBox "Неверный пароль", vbCritical + vbOKOnly, "Внимание!"
            check = check + 1 'также наращивается счетчик неправильных паролей
            Exit Sub
        End If
    End If
Next i

'в оставшемся случае - уведомления о несуществующем логине.
MsgBox "Пользователя с данным логином не существует.", vbInformation + vbOKOnly, "Внимание!"

End Sub

В макросе CommandButton1_Click используется функция GetHash (строка 15), которая преобразует входящие данные в хеш. Данная функция взята с сайта ExcelVba.ru, за что выражаю им огромную благодарность. Код необходимо вставить в главный модуль книги:

Function GetHash(ByVal txt$) As String
    Dim oUTF8, oMD5, abyt, i&, k&, hi&, lo&, chHi$, chLo$
    Set oUTF8 = CreateObject("System.Text.UTF8Encoding")
    Set oMD5 = CreateObject("System.Security.Cryptography.MD5CryptoServiceProvider")
    abyt = oMD5.ComputeHash_2(oUTF8.GetBytes_4(txt$))
    For i = 1 To LenB(abyt)
        k = AscB(MidB(abyt, i, 1))
        lo = k Mod 16: hi = (k - lo) / 16
        If hi > 9 Then chHi = Chr(Asc("a") + hi - 10) Else chHi = Chr(Asc("0") + hi)
        If lo > 9 Then chLo = Chr(Asc("a") + lo - 10) Else chLo = Chr(Asc("0") + lo)
        GetHash = GetHash & chHi & chLo
    Next
    Set oUTF8 = Nothing: Set oMD5 = Nothing
End Function

Основной код написан, теперь переходим к более мелким.

Макрос, который запускает форму авторизации (можно установить на кнопку на главном листе «Main»):

Sub Authorization_Start()
    Authorization.Show
End Sub

Также, макрос можно использовать при событии «Open» — при открытии книги:

Private Sub Workbook_Open()
    Authorization_Start
End Sub

Стоит отметить, что у большинства пользователей запуск макросов по умолчанию отключен, именно поэтому на главном листе Main необходимо сделать что-то вроде «памятки» со справочной информацией о том, как активировать работу макросов.

Макрос для закрытия книги.

При закрытии книги, нам нужно снять защиту со структуры книги, затем скрыть все листы (кроме листа «Main»), а затем снова вернуть защиту структуры книги с паролем «112» (можно установить на какую-либо кнопку):

Sub close_book()
Dim Sht As Worksheet
ActiveWorkbook.Unprotect "112"
For Each Sht In ThisWorkbook.Sheets
    If Sht.Name <> "Main" Then Sht.Visible = xlSheetVeryHidden
Next Sht
ActiveWorkbook.Protect Password:="112", Structure:=True, Windows:=False
End Sub

Да, данный макрос можно использовать при событии «BeforeClose» — перед закрытием книги. Однако, может возникнуть несколько проблем:

  • Если пользователь сохраняется вручную до закрытия документа, закрывает документ,  а затем при автоматическом запросе о сохранении нажимает «не сохранять». В таком случае, при новом запуске документа, скрытые листы будут видны всем. Да, вероятность такого события крайне мала, но она все-таки есть.
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        close_book
    End Sub
  • Если добавим принудительное сохранение после скрытия всех листов, перед окончательным закрытием файла (как на примере ниже). В таком случае, если пользователь очень сильно ошибется с данными в файле и нажмет на крестик, чтобы начать все с нуля — файл все равно сохранится и восстановить исходные данные не получится.
    Private Sub Workbook_BeforeClose(Cancel As Boolean)
        Application.ScreenUpdating = False
        close_book
        ThisWorkbook.Save
    End Sub

Поэтому, чтобы избежать такой ситуации, я хочу предложить более радикальный, менее удобный вариант, который, однако, сведет вышеперечисленные потенциальные проблемы к минимуму: помимо выполнения макроса close_book перед каждым закрытием книги с помощью события «BeforeClose» (как на первом проблемном варианте), мы будем выполнять его и перед каждым ручным сохранением файла с помощью события BeforeSave:

Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
    close_book
End Sub

Осталось только сделать памятку по включению макросов на главном листе документа, а также выполнить важный шаг, без которого все наши проделанные действия не имеют смысла — поставить пароль на проект VBA: Меню «Разработчик» — «Visual Basic» — «Tools» — «VBAProject — Project Properties» — Вкладка «Protection» — поставить галочку «Lock project for viewing» и ввести пароль и нажать «Ок».

Авторизация на VBA: защита проекта

Сохраняем файл в формате «.xlsb» или «.xlsm» и все, наша «Авторизация на VBA» готова. Помимо этого, можно защитить проект еще сильнее — о способах защиты написано моей отдельной статье.

Также, по желанию, мы можем сделать отдельную форму для администраторов, для добавления новых пользователей на лист «Settings», либо форму для восстановления пароля по какому-либо ключевому слову, но в данном примере такие функции мы реализовывать не будем.

В ЭТОЙ ЗАДАЧЕ

  • АННОТАЦИЯ

    • Создание диалогового окна

    • Образец кода для использования диалогового окна

Аннотация

В Microsoft Excel можно создать пользовательское диалоговое окно предлагает пользователю сведения с помощью текстовых полей, кнопок или других элементов окна. Как правило при вводе текста в текстовом поле появляется текст при вводе. Тем не менее можно использовать свойство Visual Basic для приложений Майкрософт в форме выпуска (VBA) для создания эффекта скрытые или «маскируемый» текстового поля. Это может быть полезно для создания диалогового окна пароль, где вы не хотите текста, введенного в текстовом поле «visible». Следующая информация описывает, как для создания этого эффекта. В начало статьи

Создание диалогового окна

  1. Запустите Excel.

  2. Нажмите клавиши Alt + F11, чтобы запустить редактор Microsoft Visual Basic.

  3. В Меню Вставкавыберите команду Формы пользователя.

  4. С помощью панели Инструментов элементы управления, добавьте текстовое поле и кнопку в форму пользователем.

  5. В окне свойств в списке объектвыберите TextBox1.

  6. На вкладке по алфавиту выберитеPasswordChar.

  7. Введите звездочку (*).

  8. В окне свойств в списке объектвыберите UserForm1.

  9. В меню запуска нажмите кнопку Запустить форму.

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

Образец кода для использования диалогового окна

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

  1. Дважды щелкните форму пользователя CommandButton1 .

  2. Введите следующий код:

    Private Sub CommandButton1_Click()    MsgBox Me.TextBox1End Sub

  3. Нажмите кнопку Сохранить для сохранения проекта.

  4. В меню запуска нажмите кнопку Запустить Sub/пользователя формы.

Введите слово в текстовом поле и нажмите кнопку . Введенный текст отображается в окне сообщения. В начало статьи

Нужна дополнительная помощь?

Содержание

  1. Создание диалогового окна «маскированный пароль» в приложениях Office с помощью Visual Basic для приложений
  2. В ЭТОЙ ЗАДАЧЕ
  3. Аннотация
  4. Авторизация в Excel на VBA
  5. Excel VBA — автоматический ввод пароля

Создание диалогового окна «маскированный пароль» в приложениях Office с помощью Visual Basic для приложений

В ЭТОЙ ЗАДАЧЕ

Аннотация

В Microsoft Excel можно создать пользовательское диалоговое окно предлагает пользователю сведения с помощью текстовых полей, кнопок или других элементов окна. Как правило при вводе текста в текстовом поле появляется текст при вводе. Тем не менее можно использовать свойство Visual Basic для приложений Майкрософт в форме выпуска (VBA) для создания эффекта скрытые или «маскируемый» текстового поля. Это может быть полезно для создания диалогового окна пароль, где вы не хотите текста, введенного в текстовом поле «visible». Следующая информация описывает, как для создания этого эффекта. В начало статьи

Нажмите клавиши Alt + F11, чтобы запустить редактор Microsoft Visual Basic.

В Меню Вставкавыберите команду Формы пользователя.

С помощью панели Инструментов элементы управления, добавьте текстовое поле и кнопку в форму пользователем.

В окне свойств в списке объектвыберите TextBox1.

На вкладке по алфавиту выберите PasswordChar.

В окне свойств в списке объектвыберите UserForm1.

В меню запуска нажмите кнопку Запустить форму.

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

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

Дважды щелкните форму пользователя CommandButton1 .

Введите следующий код:

Нажмите кнопку Сохранить для сохранения проекта.

В меню запуска нажмите кнопку Запустить Sub/пользователя формы.

Введите слово в текстовом поле и нажмите кнопку . Введенный текст отображается в окне сообщения. В начало статьи

Источник

Авторизация в Excel на VBA

Авторизация в Excel на VBA: создание формы, написание программного кода, особенности реализации.

В этой статье я расскажу вам о создании формы авторизации в Excel с помощью VBA.

Что же представляет из себя авторизация в Excel? Это форма, то есть окно, с запросом ввода логина и пароля, при успешном вводе которых, пользователю будут открываться различные листы документа, в зависимости от группы доступа пользователя. Точно также, помимо открытия листов, можно будет выставить ограничения на действия в Excel: запрет форматирования ячеек, удаление строк, столбцов, использование фильтров, объектов, сценариев и так далее. Но обо всем по порядку.

Авторизация в Excel: основной алгоритм работы

Для начала, необходимо разработать алгоритм, по которому мы будем работать, и выглядеть он будет примерно так:

Итак, поехали!

Авторизация в Excel: макет документа

Наш рабочий документ будет состоять из четырех листов:

  1. Лист с приветствием — единственный лист, который будет отображаться всем пользователям до авторизации
  2. Лист с дашбордом (визуализированным отчетом) — графики, диаграммы/гистограммы — изначально со свойством VeryHidden*
  3. Лист с данными — источник расчетов для дашборда — изначально со свойством VeryHidden
  4. Служебный/технический лист — для хранения логинов, паролей и служебной и вспомогательной информации — также, со свойством VeryHidden

*VeryHidden— свойство листа, при котором сам лист скрыт и включить его отображение можно только через использование режима разработчика. Для выбора данного свойства, необходимо в Excel зайти в меню «Разработчик» — «Visual Basic». Далее, необходимо выбрать нужный нам лист и в его свойствах («Properties») найти свойство Visible и установить в «2 — xlSheetVeryHidden».

После этого лист станет «очень скрытым». Отменить свойство VeryHidden можно точно так же через режим разработчика, либо используя необходимый нам макрос, о котором я напишу чуть дальше.

Авторизация в Excel: группы доступа

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

  1. Администраторы (Admin): доступны все листы , в том числе служебный, а также отсутствуют какие-либо ограничения.
  2. Руководители и ответственные за данные (Head): доступны 2 рабочих листа + стоит пароль на изменение структуры книги.
  3. Рядовые сотрудники компании (Worker): доступен только 1 рабочий лист с дашбордом + стоит пароль на изменение структуры книги.
Авторизация в Excel: разработка макета формы

С этим пунктом не должно возникнуть никаких проблем. Элементов на форме авторизации должно быть не так уж и много:

  • Поле ввода для логина
  • Поле ввода для пароля
  • Кнопка «Авторизация» (проверка логина и пароля)
  • Различные подписи на форме
  • По желанию: кнопка закрытия формы, кнопка восстановления пароля, логотипы, справка и все, что душе угодно

Для тех, кто не знает, как создавать формы в VBA: нужно зайти в меню «Разработчик» — «Visual Basic», нажать правой кнопкой по нашему проекту (VBAProject Название_Файла.xlsx), затем Insert — UserForm. Создается форма с названием UserForm1, на которой мы и будем размещать все наши объекты с помощью меню «ToolBox».

Если быстро набросать элементы, которые мы перечислили, должно получиться что-то вроде этого:

После добавления элементов, поменял их стандартные названия:

«UserForm1» переименовал в «Authorization».
«TextBox1» переименовал в «TextBox_Login».
«TextBox2» переименовал в «TextBox_Pass».

Также, в свойствах «TextBox_Pass», мы находим свойство «PasswordChar» и вводим любой символ, который мы хотим видеть вместо вводимых символов пароля — чаще всего используется символ «*».

Ничего лишнего, пока что все просто. Переходим далее.

Подготовка служебного листа

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

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

Авторизация в Excel: особенности и написание программного кода на VBA

Данные пункты тесно взаимосвязаны между собой, поэтому я их объединил в один большой. Здесь мы будем писать программный код для всего нашего файла: как для формы, так и для некоторых событий.

Для начала, мы напишем код, который будет отображать различные листы в зависимости от роли пользователя после авторизации. Макрос user_group мы делаем приватным и вписывать его будем не в отдельный модуль, а в нашу готовую форму Authorization. Аргументом для макроса является переменная X, которая будет содержать название группы доступа в виде текстовой строки String:

Хочу обратить внимание на то, что у нашего файла будет стоять «защита структуры книги» с паролем «112», т.е. пользователь не сможет создавать, удалять и переименовывать листы нашего документа. И, чтобы изменить видимость листов, необходимо сначала снять эту защиту программно, а затем, в зависимости от роли пользователя, поставить обратно, что мы и делаем в нашем коде.

Далее, код для кнопки «Авторизация». При нажатии на данную кнопку, запускается несколько проверок:

  • Проверка полей логина и пароля заполнение: если одно из них не заполнено — выводится уведомление, выполнение макроса прекращается.
  • Проверка переменной Check: данная переменная хранит значение «некорректных» попыток входа. Ее необходимо объявить в основном модуле книги: Public check As Integer. Если данная переменная больше 3х — доступ к авторизации в текущей сессии блокируется.
  • Поиск и проверка логина на наличие на листе «Settings». Если логин найден — введенный пароль хешируется и сравнивается с хранимым хешем на соответствующей строке логина:
    • Если все корректно — запускается макрос User_Group, который открывает доступ к листам в зависимости от группы доступа, соответствующей логину.
    • Если данные некорректные — пользователь предупреждается об этом, а также наращивается счетчик некорректных попыток авторизации.
  • В оставшемся случае (все введено, но пользователь с таким логином не найден), пользователь также уведомляется.

В макросе CommandButton1_Click используется функция GetHash (строка 15), которая преобразует входящие данные в хеш. Данная функция взята с сайта ExcelVba.ru, за что выражаю им огромную благодарность. Код необходимо вставить в главный модуль книги:

Основной код написан, теперь переходим к более мелким.

Макрос, который запускает форму авторизации (можно установить на кнопку на главном листе «Main»):

Также, макрос можно использовать при событии «Open» — при открытии книги:

Стоит отметить, что у большинства пользователей запуск макросов по умолчанию отключен, именно поэтому на главном листе Main необходимо сделать что-то вроде «памятки» со справочной информацией о том, как активировать работу макросов.

Макрос для закрытия книги.

При закрытии книги, нам нужно снять защиту со структуры книги, затем скрыть все листы (кроме листа «Main»), а затем снова вернуть защиту структуры книги с паролем «112» (можно установить на какую-либо кнопку):

Да, данный макрос можно использовать при событии «BeforeClose» — перед закрытием книги. Однако, может возникнуть несколько проблем:

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

Поэтому, чтобы избежать такой ситуации, я хочу предложить более радикальный, менее удобный вариант, который, однако, сведет вышеперечисленные потенциальные проблемы к минимуму: помимо выполнения макроса close_book перед каждым закрытием книги с помощью события «BeforeClose» (как на первом проблемном варианте), мы будем выполнять его и перед каждым ручным сохранением файла с помощью события BeforeSave:

Осталось только сделать памятку по включению макросов на главном листе документа, а также выполнить важный шаг, без которого все наши проделанные действия не имеют смысла — поставить пароль на проект VBA: Меню «Разработчик» — «Visual Basic» — «Tools» — «VBAProject — Project Properties» — Вкладка «Protection» — поставить галочку «Lock project for viewing» и ввести пароль и нажать «Ок».

Сохраняем файл в формате «.xlsb» или «.xlsm» и все, наша «Авторизация на VBA» готова. Помимо этого, можно защитить проект еще сильнее — о способах защиты написано моей отдельной статье.

Также, по желанию, мы можем сделать отдельную форму для администраторов, для добавления новых пользователей на лист «Settings», либо форму для восстановления пароля по какому-либо ключевому слову, но в данном примере такие функции мы реализовывать не будем.

Источник

Excel VBA — автоматический ввод пароля

Я хочу написать макрос Excel VBA для автоматического ввода пароля для пользователя. Таким образом, пользователю не нужно вводить пароль вручную каждый раз, когда они дважды щелкают по файлу. Это возможно? Если да, то как я могу это сделать?

Как упоминалось в моем комментарии, функциональность, которую вы ищете, по-моему, не может быть выполнена. Позвольте мне объяснить это.

Для автоматического запуска кода VBA в файле Excel вам необходимо поместить код либо в Workbook_Open() в области кода ThisWorkbook , либо в Auto_Open() в модуле.

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

Я уверен, что ваш босс — здравомыслящий парень и поймет, сможете ли вы его объяснить ему:)

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

Тема: запуск макроса при запуске Excel

Цитата из указанной ссылки

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

Запишите макрос и сохраните его, используя имя Auto_Open. Запишите макрос как процедуру Microsoft Visual Basic® для приложений (VBA) для события Open книги.

В пароле отсутствует параметр командной строки. Но что вы можете сделать, это иметь «открытую» таблицу, которая берет имя электронной таблицы и пароль в качестве параметров, а использование VBA открывает защищенную паролем электронную таблицу.

Посмотрите на его ссылку:

Это показывает только, как получить параметры командной строки — после того, как у вас есть те, которые вы можете использовать:

@iceagle, у меня недостаточно репутации, чтобы «комментировать» на @(Сиддхарт Раут), но я сожалею о комментариях и ответе, говоря, что это бессмысленно/бесполезно/не может быть сделано.

Например, если у вас есть целый набор отличий, которые вы хотите изменить, но все они защищены паролем. Если теперь вы запускаете их все через цикл, вы должны каждый раз вводить пароль (кажется глупым, если у вас 1000+ файлов нет?). Лучшая опция: закодировать макрос VBS, в котором есть пароль, и может для этого изменить все закодированные файлы! Предоставьте пользователю этот пароль, и теперь у вас все еще есть 1000 кодированных файлов, которые вам не нужно вводить каждый раз.

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

Set wb = Workbooks.Open(Filename:=»myfile.xls», Password:=»password»)

Я надеюсь, что люди, которые сталкиваются с этим, не принимают принятый ответ, как указано, но смотрите дальше.

Источник

As mentioned in my comment, the functionality that you seek, in my opinion cannot be done. Let me explain it.

To auto run a VBA code in an Excel file you need to place the code either in the Workbook_Open() in the ThisWorkbook code area or in Auto_Open() in a module.

Now these two Subs execute only after the password has been entered in a password protected file i.e after the workbook has opened. So there is no way this can be run before the password is fed to the password dialog box or before the Workbook is opened.

I am sure your boss is a sensible guy and will understand if you can explain it nicely to him :)

You might also want to see this link which explains more in details about running the macro automatically.

Topic: Running a macro when Excel starts

Link : http://office.microsoft.com/en-us/excel-help/running-a-macro-when-excel-starts-HA001034628.aspx

Quote from the above link

If you want to automatically perform certain actions whenever you start Microsoft Excel, you can record or write a macro that will run whenever you open a workbook. There are two ways to do this:

Record a macro and save it using the name Auto_Open.
Write the macro as a Microsoft Visual Basic® for Applications (VBA) procedure for the Open event of a workbook.

Макрос открывания листа с вводом пароля

ronik710

Дата: Вторник, 11.10.2011, 14:58 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 51


Репутация:

0

±

Замечаний:
0% ±


Возможно, эта тема уже поднималась на форуме. Но я ее не нашел…

Мне нужно сделать кнопку с макросом, который бы открывал нужный скрытый лист с запросом на ввод пароля.
Т.е. этот лист мог открыть только тот юзер, который знает пароль.

 

Ответить

RAN

Дата: Вторник, 11.10.2011, 16:54 |
Сообщение № 2

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

smile

К сообщению приложен файл:

5746769.xls
(47.5 Kb)


Быть или не быть, вот в чем загвоздка!

 

Ответить

nerv

Дата: Вторник, 11.10.2011, 18:42 |
Сообщение № 3

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

при вводе двойки пишет «Неверный пароль» и при этом отображает скрытый лист


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

nerv

Дата: Вторник, 11.10.2011, 18:44 |
Сообщение № 4

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Exit For


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

RAN

Дата: Вторник, 11.10.2011, 19:30 |
Сообщение № 5

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Да, немного второпях доделывал неверный пароль.
Так лучше.

К сообщению приложен файл:

pass.xls
(51.5 Kb)


Быть или не быть, вот в чем загвоздка!

 

Ответить

nerv

Дата: Вторник, 11.10.2011, 21:10 |
Сообщение № 6

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Да я сам поторопился : )

Как вариант для данного случая
[vba]

Код

Private Sub CommandButton1_Click()
Dim v
For Each v In Array(«2», «3»)
     If v = Me.TextBox1.Value Then Sheets(CInt(v)).Visible = True: Unload Me: Exit Sub
Next
MsgBox «Не верный пароль», vbCritical: Unload Me
End Sub

[/vba]


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

 

Ответить

RAN

Дата: Вторник, 11.10.2011, 21:40 |
Сообщение № 7

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Ну ты и загнул! smile
А как насчет пароля «Саня»? cool


Быть или не быть, вот в чем загвоздка!

 

Ответить

Саня

Дата: Вторник, 11.10.2011, 22:10 |
Сообщение № 8

Группа: Друзья

Ранг: Ветеран

Сообщений: 1067


Репутация:

560

±

Замечаний:
0% ±


XL 2016

не смог пройти мимо такого кода

Code

Private Sub Worksheet_Deactivate()
Application.EnableEvents = True
Me.Visible = 2
End Sub

внутри обработчика события пытаться включит обработку событий не логично:
если они включены, то и включать их нет смысла,
а если выключены, то в эту процедуру не попасть…

ps тем более меня приплели…

Quote (RAN)

А как насчет пароля «Саня»? cool

 

Ответить

RAN

Дата: Вторник, 11.10.2011, 22:50 |
Сообщение № 9

Группа: Друзья

Ранг: Экселист

Сообщений: 5645

Похоже, какой-то глюк с компом.
Сейчас перестала работать почта, на форум чуть вошел…
А перед этим Private Sub Worksheet_Deactivate заработала только после того, как впихнул строку Application.EnableEvents = True

PS так и nerv — Саня…


Быть или не быть, вот в чем загвоздка!

 

Ответить

nerv

Дата: Среда, 12.10.2011, 09:18 |
Сообщение № 10

Группа: Редакторы

Ранг: Обитатель

Сообщений: 431

Quote (RAN)

А как насчет пароля «Саня»?

Вот тебе и «Саня» happy

Code

Private Sub CommandButton1_Click()
Dim v
For Each v In Split(«Таня2;Саня3», «;»): v = Split(v, «»)
        If v(0) = Me.TextBox1.Value Then Sheets(CInt(v(1))).Visible = True: Unload Me: Exit Sub
Next
MsgBox «Не верный пароль», vbCritical: Unload Me
End Sub

Quote (RAN)

PS так и nerv — Саня…

Ну, да)

Quote (RAN)

Похоже, какой-то глюк с компом.
Сейчас перестала работать почта, на форум чуть вошел…

На вирусы проверяй : )


Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина — самый громкий звук

YM 41001156540584 / WM WMR R21924176233

https://github.com/nervgh/vba

Сообщение отредактировал nervСреда, 12.10.2011, 09:20

 

Ответить

ronik710

Дата: Среда, 12.10.2011, 12:00 |
Сообщение № 11

Группа: Пользователи

Ранг: Участник

Сообщений: 51


Репутация:

0

±

Замечаний:
0% ±


Спасибо большое!

 

Ответить

Killerlord

Дата: Среда, 17.02.2016, 19:19 |
Сообщение № 12

Группа: Пользователи

Ранг: Новичок

Сообщений: 21


Репутация:

0

±

Замечаний:
80% ±


Excel 2007

Парни вот точно такой же Excel, только мне нужно чтоб при нажатии на 1,2,3,4,5,6 просил пароль и для каждой строки разный пароль, с срабатыванием гиперсылки, а форму пароль удалить
[moder]Нарушение п. 5q Правил форума.

К сообщению приложен файл:

p11ass.xls
(50.0 Kb)

Сообщение отредактировал _Boroda_Среда, 17.02.2016, 21:20

 

Ответить

Like this post? Please share to your friends:
  • Vba excel параметры функции
  • Vba excel переменная как имя переменной
  • Vba excel параметры текста
  • Vba excel параметры печати
  • Vba excel параметры листа