Как заставить пользовательскую форму в Excel VBA запомнить пароль при нажатии «красный крестик»

У меня есть пользовательская форма, которая вызывает функцию с подсказкой имени пользователя/пароля.

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

Он работает нормально, пока пользователь не нажмет кнопку «процесс» или не закроет пользовательскую форму с помощью кнопки «закрыть», но когда он / она закроет ее с помощью «красного крестика», пользователь/пароль исчезнет при следующем запуске.

Я знаю, что «красный крестик» можно отключить, но мне любопытно, есть ли другой способ заставить пользовательскую форму помнить даже при нажатии «красного крестика»?

Вот мой код:

Private Sub cbCancel_Click()
maplogin.Hide
End Sub

Sub cbProcess_Click()

Dim drivetomap As String
Static user As String
Static pass As String

pcname = ActiveCell.Value
user = Me.txtUser.Value
pass = Me.txtPass.Value
...

person Divin3    schedule 24.11.2015    source источник
comment
вы можете использовать скрытый рабочий лист, чтобы сохранить пользовательский ввод.   -  person psychicebola    schedule 24.11.2015


Ответы (2)


Вместо этого вы можете перенаправить X для запуска кода кнопки отмены:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode = vbFormControlMenu Then
        Cancel = True
        cbCancel_Click
    End If
End Sub
person Rory    schedule 24.11.2015
comment
Протестировано. Работает отлично! Простой. Мне это нравится! - person Divin3; 24.11.2015

Здесь есть несколько моментов. Давайте сначала разберемся с вашим конкретным вопросом: вы можете использовать событие QueryClose для обработки закрытия Userform, и в вашем случае вы должны установить для параметра Cancel значение True (или вообще любое целое число, отличное от 0), чтобы вы могли Hide форму, а чем Unload это. Вот так:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
    If CloseMode <> vbFormCode Then
        Cancel = True
        Me.Hide
    End If
End Sub

Но есть и другие проблемы.

  1. Если вы используете этот экземпляр Userform для хранения пароля, вам нужно будет ограничить переменные на уровне модуля, чтобы вы могли получить доступ к переменным вне вашей процедуры cbProcess_Click. Как показано ниже:

    Option Explicit
    Private mPcName As String
    Private mUser As String
    Private mPass As String
    
    Private Sub cbCancel_Click()
        maplogin.Hide
    End Sub
    
    Sub cbProcess_Click()
    
        mPcName = ActiveCell.Value
        mUser = Me.txtUser.Value
        mPass = Me.txtPass.Value
        '...
    End Sub
    
  2. Ключевое слово Static в VBA можно использовать только на уровне процедуры. Да, он сохранит значения переменных после завершения процедуры, но вы все равно не сможете получить доступ к этим переменным вне процедуры. Отсюда и использование Private для объявлений на уровне модуля.

  3. Жизнь усложняется, если вы храните переменную, относящуюся к приложению, в файле Userform. По сути, это означает, что вы никогда не сможете Unload Userform на протяжении всей программы. Гораздо лучше было бы передать эти значения в какой-либо другой метод хранения. Примерами могут быть передача их в Module, передача их в Class, запись их в скрытый Worksheet и т. д. Пример модуля будет таким:

Модуль

    Option Explicit
    Private mUser As String
    Private mPass As String

    Public Sub SetLogin(user As String, pass As String)
        mUser = user
        mPass = pass
    End Sub

Пользовательская форма

    SetLogin Me.txtUser.Value, Me.txtPass.Value
person Ambie    schedule 24.11.2015
comment
Отличное объяснение, теперь я понимаю его логику. Этот метод работает так же, как и другой ответ. Я не хочу использовать пользователя/пароль вне этой пользовательской формы. Никаких других пользовательских форм или модулей, использующих эти данные, не будет. Он вызывает функцию, которая будет использовать данные для подключения сетевого диска, работающего только с учетной записью администратора домена Windows. В вашем третьем пункте есть логика. Но когда я сменил пользователя на не админа, он сразу отказался работать. - person Divin3; 24.11.2015