#excel #vba #button #activex #isenabled
#excel #vba #кнопка #activex #включено
Вопрос:
Привет, у меня есть пользовательская форма, в которую пользователь вводит поля профиля varius.
Как только она заполнена, выполняется проверка — если что-то сбивается с пути,
CommandButton
, namedsave_button
отключается
Чего я хочу добиться: если пользователь нажимает на кнопку, пока она находится в отключенном состоянии, чтобы отобразить MsgBox
сообщение о том, что ему нужно исправить неправильно заполненное поле
В демонстрационных целях я не собираюсь вставлять сюда процедуры проверки, поэтому давайте просто представим, что save_button.Enabled = False
задано из getgo. Выдает тот же результат.
save_button.Enabled = False ' already ran before, pretend this executes it
Private Sub save_button_Click()
If save_button.Enabled = False Then
MsgBox "Clicked disabled button"
End If
End Sub
Проблема в том, что как только для CommandButton установлено значение .Enabled = False
, его больше нельзя официально нажимать (следовательно, он даже не может запустить Click()
процедуру)
Моей следующей мыслью было использовать MouseUp
в качестве замены. Проблема в том, что это срабатывает при любом незначительном движении над кнопкой, и я не хочу бомбардировать пользователя MsgBox
сообщениями
Можете ли вы придумать какие-либо альтернативы относительно того, как определить, нажал ли пользователь отключенную кнопку?
Комментарии:
1. Возможно, ответ заключается в проверке каждого ввода по мере необходимости. Если форма настроена правильно, пользователь никогда не сможет вводить неправильные данные в какое-либо поле. Затем вы можете 1) запустить процедуру, которая вызывается при нажатии кнопки сохранить, которая проверяет, все ли было заполнено перед продолжением кода, или 2) вообще не разрешать отображение кнопки сохранить, пока все не будет заполнено. Для этого потребуется код при выходе из каждого окна, вызывающий функцию, которая показывает кнопку сохранения только тогда, когда выбраны все необходимые поля
Ответ №1:
Когда элемент управления отключен, событие щелчка всплывает вверх по дереву. В вашем случае, я думаю, вместо этого пользовательская форма получит щелчок. Если вы поместите кнопку сохранения внутри фрейма, который получит щелчок, если кнопка отключена. Довольно легко сделать рамку невидимой, установив
- Подпись к «»
- BorderStyle в fmBorderStyleNone
- Специальный эффект для fmSpecialEffectFlat
А затем измените размер рамки так, чтобы она была того же размера, что и кнопка. Код прост:
Private Sub YourNewFrame_Click()
MsgBox "Save button disabled!"
End Sub
Совет: Если вы нарисуете рамку, вырежете свою кнопку и вставьте ее в новую рамку, она будет размещена правильно. Правильно, как в правой части иерархии. Визуально вам придется делать вручную.
Комментарии:
1. эй, на самом деле, еще одна проблема — я хочу, чтобы рамка была
Enabled
только тогда, когда кнопка отключена. Что не создает проблемы. Однако .. если фрейм отключен, кнопка внутри него также становится отключенной. Есть ли способ обойти это?2. Нет необходимости касаться свойства frame enabled. Оставьте ее включенной и пусть она закрывает только кнопку и ничего больше. Сделайте так, чтобы она идеально соответствовала размеру кнопки.
Ответ №2:
Я хочу предложить другой подход, основанный на моем комментарии к вашему вопросу.
На приведенном ниже gif вы увидите, что «Создать форму» не включается до тех пор, пока не будет предоставлена вся необходимая информация. Вы не часто видите это в gif, но каждая запись, требующая проверки, также содержит это за кулисами в коде.
Основной код, лежащий в основе этого действия, заключается в следующем:
Sub checkFields()
Select Case True
Case Len(Me.formTitleLine1) = 0, Len(Me.formPrefix) = 0, Len(Me.formNumber) = 0, Len(Me.formProduct) = 0, Len(Me.formEditionMonth) = 0, Len(Me.formEditionYear) = 0
Me.createForm.Enabled = False
Case Else
Me.createForm.Enabled = True
End Select
End Sub
И это вызывается при afterUpdate
событии каждого соответствующего поля:
Private Sub formEditionYear_AfterUpdate()
checkFields
End Sub
С одним небольшим изменением в подразделе checkFields кнопка сохранения может отображаться только после того, как все будет заполнено правильно. Это изменение будет:
Me.createForm.Visible
вместо
Me.createForm.Enabled