Простой пример использования _AfterUpdate
события
Вместо того, чтобы реагировать каждый раз, когда одна часть информационного текстового поля изменялась событием _Change
элемента управления, более эффективно использовать _AfterUpdate
событие приостанавливается до тех пор, пока вы не переключитесь на другой элемент управления (кстати, его можно легко увеличить с помощью процедуры CommandButton
).
Во избежание ненужных вызовов выполняется сравнение старого и текущего информационного текста с использованием определения type в заголовке объявления модуля кода. Кроме того, я добавил в это определение логическую переменную IsTest, чтобы позволить тестовое отображение изменений, сделанных при запуске некоторых других элементов кода (см. B).
Дополнительная подсказка: есть нет рекурсии , * Событие 1017 * или AfterUpdate
запускаются только как реакция на каждое отдельное изменение или обновление, т. Е. Не имеет значения, если они запускаются с помощью настроек Userform_Initialize
или возможного пользовательского ввода, однако проверка состояния предотвращает активацию Init.
Декларация главы модуля кода Userform
Option Explicit ' declaration head of code module
'User defined type
Private Type TThis
cnt As Long
oldTxt As String
IsTest As Boolean
End Type
Dim this As TThis
Private Sub UserForm_Initialize()
'[1]assign text to Info-Control
Me.TextBox1.Text = "bla bla"
'[2]remember text
this.oldTxt = Me.TextBox1.Text
'[3]optional choice of test modus
this.IsTest = True
If this.IsTest Then Debug.Print " #", "Change history", "(new) text" & vbNewLine; 0, Now, this.oldTxt
End Sub
Private Sub TextBox1_AfterUpdate()
'~~~~~~~~~~~~~~~
'~> Example call
'~~~~~~~~~~~~~~~
check Me.TextBox1
End Sub
Sub check(myTextbox As MSForms.TextBox)
' Purp.: compare current text with old text
If this.oldTxt <> myTextbox.Text Then
'a) optional test display
If this.IsTest Then this.cnt = this.cnt + 1: Debug.Print this.cnt, Now, myTextbox.Text
'b) do other stuff
' ...
'c) remember old text
this.oldTxt = myTextbox.Text
End If
End Sub