Страницы: 1
RSS
Задержка выполнения макроса при вводе данных в TextBox, Чтоб срабатывал макрос только после ввода всех символов, а не после каждого
 
Есть TextBox, при изменении текста в котором должен срабатывать макрос. Но надо, чтоб макрос сработал после ввода всех символов, но не выходя из самого TextBox. Т.е. через некоторое время после ввода последнего символа, а не при вводе каждого символа.

Делал так.

'В модуле:
Код
Public TextBoxUpdateTime
Sub MyMacro()
MsgBox "Hello!"
End Sub

'В модуле формы:
Код
Private Sub TextBox_Change()
Dim tx
tx = TimeValue("00:00:05") ' интервал задержки
If TextBoxUpdateTime+ tx < Now Then ' если время выполнения макроса ещё не подошло
On Error Resume Next
Application.OnTime TextBoxUpdateTime+ tx, "MyMacro", Schedule:=False ' отмена запуска макроса в старое время
On Error GoTo 0
TextBoxUpdateTime= Now
Application.OnTime TextBoxUpdateTime+ tx, "MyMacro" ' назначение запуска на новое время
End If
End Sub

Почему-то срабатывает через 5 сек после начала ввода символов, а не после. Где тут косяк, не могу понять.
 
Не совсем понятно задание.
Как вариант следить за числом введенных символов, если оно известно или сделать обработку TextBox после контрольного символа, например Ввод.
Код
Private Sub TextBox_Change()    
 Dim LenText As Byte    
 LenText = Len(TextBox.Text)
    If LenText = 7 Then
    ' действие
    End If
End Sub

Private Sub TextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 13 Then
    ' действие
    End If
End Sub
 
Цитата
tolikt написал:
через 5 сек после начала ввода символов, а не после
- как определить конец ввода символов?
 
Макрос должен срабатывать, если 5 сек не вводится новых символов. Кол-во символов - любое.
 
Код
Dim TextBoxUpdateTime As Date

Private Sub TextBox1_Change()
    Dim tx As Date
    tx = TimeValue("00:00:05")    ' интервал задержки
    On Error Resume Next
    Application.OnTime TextBoxUpdateTime, "MyMacro", Schedule:=False    ' отмена запуска макроса в старое время
    On Error GoTo 0
    TextBoxUpdateTime = Now + tx
    Application.OnTime TextBoxUpdateTime, "MyMacro"    ' назначение запуска на новое время
End Sub
 
Вот чуял, что нюанс где-то совсем рядом, но сам не допёр.
Спасибо, Уго! Всё ОК.
 
Не забудьте далее по задаче отключать
Код
Application.OnTime TextBoxUpdateTime, "MyMacro", Schedule:=False

иначе будет отрабатывать в самый неподходящий момент :)
 
Цитата
tolikt написал:
если 5 сек не вводится новых символов
А если пользователь начал вводить, захотел чихнуть, отвлекся и...
Я всегда относился к подобным изворотам не очень дружелюбно, потому что момент окончания ввода данных пользователем невозможно отследить на уровне элемента. Самый оптимальный вариант в большинстве случаев - по нажатию кнопки ОК(которая призвана выполнить всю работу по окончании заполнения данных) проверять корректность заполнения данных.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Да вероятно опять "наши бабушки не обучены работать", забывают ОК нажимать, зовут на помощь с претензией "не работает" :)
 
The_Prist полностью поддержу "Самый оптимальный вариант в большинстве случаев - по нажатию кнопки ОК", но бывают исключения, например запрос в базу с фильтром по значению элемента при наборе и отображением результатав списке. Чтоб не запрашивать  на каждый символ, допускаю что пауза может помочь.
По вопросам из тем форума, личку не читаю.
 
Да, это частный случай. Но даже в этом случае наиболее предпочтительно выполнять поиск(запрос) по базе по нажатию кнопки. Ибо опять же непонятно - пользователь уже завершил ввод или еще думает :) Или уж каждый символ можно отслеживать, если список для поиска небольшой. В любом случае, задержка в 5 сек слишком велика, чтобы это было удобным для вывода списка. Быстрее кнопку нажать, чем ждать по 5 секунд каждый раз, как закончил вводить...
Ну в принципе я никогда не забываю об одном правиле: любой подход к решению задачи зависит от самой задачи. Если автор считает, что в его случае это оптимально - ему виднее. Мы не знаем какие цели преследуются и просто обсуждаем варианты :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Offtop
The_Prist,  Хуже когда нет ни таймаута, ни возможности обработать ENTER нормально. Есть у меня формочка на HTA c подобным :-(. Но это не Excel.
По вопросам из тем форума, личку не читаю.
 
Я увидел такую причину - чтоб человек не заблокировал общественный файл, убежав курить или на обед в процессе этого ввода.
А так можно через 5 сек. выйти из элемента, а ещё например через 15 сек. бездействия закрыть файл.
 
Да, задача изначально была в точности, как описал БМВ: запрос в базу с фильтром по значению элемента и именно чтоб не запрашивать на каждый новый символ, а после паузы сразу весь текст. Просто я не стал расписывать подробно, для чего именно нужна вся эта штуковина.
Пауза 5 сек, конечно, многовато. Но это уже в процессе оптимизируется.

Спасибо всем!
Страницы: 1
Наверх