Я создаю пользовательскую форму, где у нее есть два текстовых поля для ввода дат. После ввода даты я проверяю их, когда происходит событие Exit
. Если проверяется, что пользовательские данные не являются тем, что необходимо, пользователь уведомляется, текстовое поле очищается, а фокус возвращается обратно в текстовое поле.Excel VBA - Вызов события TextBox для входа в Userform вручную?
Проблема возникает, если пользователь использует мышь для выбора вне поля, а не Tab. Если используется Tab, он срабатывает отлично и, как ожидалось, и поле очищается, а фокус возвращается. Если мышь используется, она не срабатывает. Согласно this article, это ожидаемое поведение (это для доступа, но я не видел аналогичную соответствующую статью MSDN для Excel.)
Так что вместо этого я попробовал событие AfterUpdate
. Однако SetFocus
не работает в событии AfterUpdate
, я предполагаю из-за цепочки событий, как указано в ответе на this question. Таким образом, у меня нет способа вернуть фокус обратно в текстовое поле после его запуска. Этот поток имел предложение в качестве альтернативного ответа на SetFocus
на другой элемент управления и возвращался в качестве обходного пути, но это не работает для меня, поэтому я предполагаю, что это может быть обходное решение для конкретного доступа.
Моего последний варианта Я рассмотрел это имеющий AfterUpdate
события просто называю Exit
события, однако Exit
события имеет необходимый аргумент (ByVal Cancel As MSForms.ReturnBoolean)
, который, как вы отмените выход и возвращаете пользователь в текстовое поле. Таким образом, нет никакого значения, которое вы можете передать ему, которое не вызывает ошибку, которую я могу найти (ближайший я обнаружил, что он прошел Nothing
, но он не удался при попытке установить его на True
позже, чтобы отменить выход .)
Есть ли способ достичь того, что я ищу здесь, или я должен просто придерживаться AfterUpdate
и игнорировать SetFocus
, которого я пытаюсь достичь?
Было бы очень полезно показать существующий код. Вам не нужно класть весь свой код в обработчики событий: переместите сравнение дат в автономный суб и просто вызовите это из обработчиков событий. Новый Sub позаботится о том, чтобы установить фокус обратно в соответствующее текстовое поле. –
Спасибо, Тим, я попытаюсь перенести его на отдельный суб-первый. Это может помочь мне уменьшить часть моего кода, поскольку в настоящее время у меня есть дублирование для разных текстовых полей. Я не опубликовал полный код, поскольку он довольно длинный (он проверяет довольно много сравнений между разными датами и текущим временем), но при необходимости я вернусь и отредактирую в соответствующих битах. – Goose306