Страницы: 1
RSS
Процедура нажатия кнопки срабатывает раньше чем проверка на корректность данных в Textbox_exit
 
Уважаемые знатоки, подскажите пожалуйста как решить проблему:

При вводе значений в Textbox (на форме) необходима проверка на наличие остатков данного материала, которую я выполняю с помощью процедуры Textbox_exit. Имеется кнопка "сохранить" - данные сохраняются на листе.
Если после ввода значения в Textbox перейти на какой нибудь элемент формы по табуляции (или мышкой на новую строку) Textbox_exit работает. Однако если после ввода значения в Textbox сразу мышкой нажать кнопку "сохранить" То процедура нажатия кнопки срабатывает раньше чем Textbox_exit.
Что у меня не правильно или как сделать, чтобы проверка все же проводилась?

Интуитивно понимаю, что нужно описать ту же процедуру и для мышки. Но не пойму какую.
 
Цитата
vsahno написал: Если после ввода значения в Textbox перейти на какой нибудь элемент формы по табуляции ... Textbox_exit работает.
Однако если ... сразу мышкой нажать кнопку "сохранить" То процедура нажатия кнопки срабатывает раньше чем Textbox_exit.
Всё нормально ... "Textbox_exit" связано с фокусировкой объекта, с появлением и потерей фокусировки (и "Таб order"; порядок табуляции), ну, видно кнопка у вас не переносит фокуса на другой объект. Порядок событий при перемещении фокуса:
UserForm_Initialize => TextBox1_Enter => TextBox1_Change => перемещение фокуса => TextBox1_BeforeUpdate => TextBox1_AfterUpdate => TextBox1_Exit => TextBox2_Enter => перемещение фокуса

Попробуйте:
 
Спасибо огромное!!! Сам бы изобретал велосипед еще очень долго и придумывал бы какие-то промежуточные процедуры.
У меня действительно идет сразу сохранение в таблицу на лист книги. Ни к каким объектам формы процедура не обращается.
Сделал как у Вас заработало.
Но....
У меня в процедуре проверки
Код
Private Sub txtKol1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
   MsgBox "TextBox1_Exit";
   nn = 1
   Nazv_TMC = Me.Controls(cmbNazv & nn).Text
   Kol_TMC = Me.Controls(txtKol & nn).Value
   If Остатки(Nazv_TMC, Kol_TMC, nn) Then
   Else
      Cancel = True   '"<-" строка вызывает ошибку времени выполнения 
   End If
End Sub
Private Sub B_Сохранить_Приход_Click()
   txtFoxus.SetFocus 
   txtFoxus = "Focus"
   MsgBox "сработала кнопка"
End Sub
Function Остатки(Name_TMC As String, Kol_TMC As String li As Long) As Boolean
   Остатки = False
End Function

"<-" строка вызывает ошибку времени выполнения: run-time error '-2147467259 (80004005) Unspecified error
и  я понимаю почему:
если функция Остатки = True то метод Cancel не вызывается и все хорошо отрабатывает.
но если остатков не хватает то Cancel = True не дает возможности перенести фокус на txtFoxus.SetFocus и происходит эта ошибка.
Не пойму как это обработать!
Если не вызываю txtFoxus.SetFocus, то строка  txtFoxus = "Focus" не вызывает процедуру  Sub txtKol1_Exit
Получается мне все равно нужно придумать искусственный перенос фокуса, но сделать это как-то по другому.

Пока готовил Вам файл для примера - нашел причину: Дело видимо во Frame в который заключены мои ТекстБоксы.
Пока были TextBoxы без Frame  - все работало как у Вас. Как только заключил их во Frame - получил то что у меня.
Кому интересно - посмотрите пример:

Frame я конечно уберу. Но...
Кто-то может сказать в чем тут дело? и ПОЧЕМУ при переходе мышкой из TextBox если он заключен во Frame не вызывается процедура TextBox_Exit  а без Frame вызывается???

Автору ответа -все равно ОГРОМНОЕ СПАСИБО!
Если бы не Ваш пример сидел бы и потел над необъянимым поведением VBA
А так благодаря Вам и попыткой показать что у меня не так - все-таки нашел причину!

P.S.
Ну и гадость эта ваша заливная рыба-VBA
и за что я ее все равно люблю? :)
Изменено: vsahno - 11.02.2019 14:17:02
 
Цитата
vsahno написал:
строка вызывает ошибку времени выполнения: run-time error
Так в общем, не знаю, что вы хотите сделать, но попробуйте так, может это сработает (смотрите файль).
Цитата
vsahno написал:
эта ваша заливная рыба-VBA
??? Какая же вновь рыба ???
"ocet" это на русском значит рыба ?
Вот прикольно, не знал ... :) ...


 
Цитата
ocet p написал:
??? Какая же вновь рыба ???"ocet" это на русском значит рыба ?Вот прикольно, не знал ...  ...
Спасибо, посмотрю.
Я не знаю на каком языке Осет -  рыба  Может осетр?
Да я просто имел ввиду, что VBA иногда работает непредсказуемо (во всяком случае для меня - я его учил по ходу решения задач - довольно поверхностно -лишь бы работало!). Потому и гадость! То ли дело Бейсик или Паскаль  :)
Страницы: 1
Наверх