После ввода в текстовое поле как вызвать запуск события AfterUpdate?

#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, вопрос возникнет четыре раза. Даже один раз — это слишком много. Мне нужно, чтобы оно определяло, когда курсор покидает это поле (?)