#excel #vba #textbox
#excel #vba #текстовое поле
Вопрос:
У меня есть пользовательская форма Excel VBA с несколькими текстовыми полями.
Пользователь введет вес в текстовое поле. Затем они могут выполнять другие действия в форме или нажимать Применить, Обновить, предыдущее событие, следующее событие или Отменить.
После ввода веса его необходимо проверить, и если все в порядке, форма помечается как mbFormChanged=True
. Эта проверка происходит в событии AfterUpdate текстового поля.
Моя проблема в том, что если пользователь вводит значение и сразу нажимает Применить, Обновить, Предыдущее событие или следующее событие, поле не проверяется, и оно выглядит так, как будто оно никогда не изменялось.
Т.е. введите вес: 200 [Обновить]
Однако, если пользователь переходит в другое поле после ввода веса, то оно проверяется, и форма помечается как измененная.
Т.е. введите вес: 200 [Вкладка] [Обновление]
Как я могу убедиться, что AfterUpdate запускается при нажатии командной кнопки сразу после этого?
Я не могу поместить проверку в точку OK / Apply, потому что в тот момент, когда пользователь вводит новый вес, и он действителен, он немедленно обновляет многие другие поля и списки, видимые в форме (обновление в режиме реального времени).
Комментарии:
1. Добавьте Change_Event, который предложит пользователю (используя MsgBox), закончил ли он вводить вес. Если Он нажмет ok, то передаст фокус, используя свойство SetFocus , другим элементам управления.
Ответ №1:
Я предполагаю, что это пользовательская форма Excel, и в этом случае я не думаю, что есть встроенное AfterUpdate
событие. Формы Excel ни к чему не привязаны (в отличие от Access), поэтому форма ничего не обновляет. Вам нужно будет создать свое собственное AfterUpdate
событие.
Комментарии:
1. Да, Excel. Существует встроенное событие AfterUpdate для всех текстовых полей. Мой называется txtNewWeight_AfterUpdate (), в который я поместил свой сценарий проверки. Я просто не знаю, как заставить его запускаться, когда пользователь нажимает командную кнопку сразу после ввода нового значения.
2. После обновления срабатывает, когда вы покидаете текстовое поле. к тому времени, как пользователь нажал кнопку, обновление after пришло и ушло. Вы не можете просто вызвать код проверки нажатием кнопки, поскольку именно тогда вы хотите, чтобы это произошло?
3. Спасибо, но мне нужно, чтобы проверка была немедленной, потому что в дополнение к проверке могут быть немедленно обновлены другие связанные поля перед окончательным нажатием кнопки OK / Apply. (Обновил мой вопрос, чтобы сказать это.)
4. @ShariW ну, если пользователь нажимает OK и проверка завершается неудачей, вам не следует продолжать обновление. Вы можете либо подтвердить текстовое поле, когда оно теряет фокус (обычное событие AfterUpdate), либо подтвердить форму нажатием кнопки отправки.
5. Давайте подумаем о том, что вы здесь говорите
I can't put the validation at the point of OK/Apply because the moment a user enters a new weight and it is valid [do stuff]
вы говорите, что это место, где это можно сделать прямо здесь:and it is valid
т. е. проходит проверку. Нажмите -> проверить -> если допустимо, обновите свои данные, если недопустимо, вызовите то, что недопустимо, и не обновляйте.
Ответ №2:
Я знаю, что это старый / неработающий поток, и я, конечно, надеюсь, что исходная проблема была решена, но на случай, если кто-то еще ищет это, вот что я делал в похожих ситуациях: откройте свою форму с помощью кнопок «Ok» / «Done» / «Exit» или любых других кнопок, которые вы используете для подтверждения ввода в форму, затем выйдите из формы в отключенном состоянии. Таким образом, они ничего не делают, если нажать на. Как только проверка ваших данных будет завершена, включите эти кнопки (или обведите назад для исправленных записей).
Ответ №3:
Как указано, вы можете попробовать это:
Private Sub TextBox1_Change()
If (MsgBox("Done?", vbYesNo)) = vbYes Then Me.TextBox2.SetFocus 'Or any other ctrl
End Sub
Приведенный выше код, подобный вызывающему событие TextBox1_AfterUpdate().
Комментарии:
1. Спасибо. Это сработало бы для некоторых приложений и типов ввода, но не для моего. После каждого ввода символа проверяется, выполнено ли. Итак, если мне придется ввести 75.3, вопрос возникнет четыре раза. Даже один раз — это слишком много. Мне нужно, чтобы оно определяло, когда курсор покидает это поле (?)