Есть ли способ определить, нажал ли пользователь отключенную кнопку?

#excel #vba #button #activex #isenabled

#excel #vba #кнопка #activex #включено

Вопрос:

Привет, у меня есть пользовательская форма, в которую пользователь вводит поля профиля varius.

Как только она заполнена, выполняется проверка — если что-то сбивается с пути, CommandButton , named save_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