У меня есть две частных подписки для активных флажков x. Когда я нажимаю одну кнопку, другая кнопка блокируется. Я хочу создать кнопку, которая будет действовать как переопределение, где, если я введу пароль, два частных подпрограммы не будут работать.
Private Sub CRM_box_Click()
If CRM_box.Value = True Then
CheckBox14.Value = False
CheckBox14.Enabled = False
Else
CheckBox14.Value = False
CheckBox14.Enabled = True
End If
Private Sub RMP_box_Click()
If RMP_box.Value = True Then
CRM_box.Value = False
CRM_box.Enabled = False
Else
CRM_box.Value = False
CRM_box.Enabled = True
End If
Чтобы «переопределить» Private Sub
для ваших флажков, вы можете сделать следующее:
В вашем VBE создайте модуль (если у вас его еще нет) и введите Public override As Boolean
в первой строке.
Для каждой из ваших частных подписок для флажков добавьте следующее над текущим оператором If
: If override = False Then Exit Sub
вот так:
Private Sub CRM_box_Click()
If override = False Then Exit Sub
If CRM_box.Value = True Then
RMP_box.Value = False
RMP_box.Enabled = False
Else
RMP_box.Value = False
RMP_box.Enabled = True
End If
End Sub
Что касается парольной части вашего вопроса, вы можете создать UserForm
.
Если вы не знакомы с UserForms, существует множество руководств и инструкций о том, как их создавать, выполнив поиск в Google или аналоге вроде «Как создать пользовательскую форму в excel».
Я сделал простой UserForm
с label
, textbox
и commandbutton
. Глянь сюда.
Для commandbutton
вы можете использовать следующий код:
Private Sub CommandButton1_Click()
Dim pwrd As String
Dim setPwrd As String
pwrd = UserForm1.TextBox1.Text
setPwrd = "abc" 'Change this string to whatever you want your password to be
If pwrd = setPwrd Then
override = False
Unload UserForm1
Else
MsgBox "Incorrect Password" & vbNewLine & "Please try again.", vbCritical
End If
End Sub
Когда вы вводите свой пароль в текстовое поле и нажимаете кнопку команды, vba сравнивает ваш ввод с переменной setPassword
. Если это совпадение, он устанавливает для публичной переменной override
значение False
. Если пароль не совпадает, вы получите сообщение, чтобы повторить попытку.
Если override = False
, он направляет ваш Private Sub
для ваших флажков на Exit Sub
перед выполнением кода - ваш код «переопределен».
В итоге:
Вы можете найти этот ответ полезным в понимании способов предотвращения доступа других пользователей к вашей форме пароля.
Спасибо, это работает именно так, как вы описали. Один вопрос, как только я установлю пароль и выйду из подпрограммы, есть ли способ отменить команду? Я попытался создать вторую командную кнопку с другим паролем, чтобы перевернуть override = true, но тогда мой исходный код не запускается. Еще раз спасибо!
Я рада, что помогло! В коде для флажков добавьте Else
в конец If override = False Then Exit Sub
. Для вашей второй командной кнопки скопируйте точный код для первой командной кнопки и измените override = False
на override = True
. Если вам нужен другой пароль для второй кнопки, это вообще не должно быть проблемой. Просто запомните, какой пароль для какой кнопки. Если он ответил на ваш вопрос, обязательно отметьте ответ как принятый, чтобы помочь другим членам сообщества, если у них есть тот же вопрос.
Что вы имеете в виду «не будет работать»? ... чтобы другой раздел кода не вызывал их, или вы пытаетесь запретить пользователям входить в VBA и запускать их вручную? Если это проблема безопасности, я должен вас предупредить, что нет такой вещи, как 100% безопасный общий документ Office; только способы усложнить людям делать то, что они хотят.