Есть ли причина того, что процедурное событие пользовательской формы _change не является рекурсивным? - PullRequest
0 голосов
/ 10 февраля 2020

У меня есть данные в текстовом поле (назовите это info) в пользовательской форме, которые я бы хотел, чтобы пользователь мог изменить, поэтому я настроил подпрограмму info_change (). Проблемы:

(1), когда я загружаю исходные данные в info.text из VBA, вызывается подпрограмма info_change ().

(2), когда я go в поле информации чтобы изменить значение ВНУТРИ информационного поля, он снова вызывает подпрограмму info_change () и продолжает вызывать подпрограмму до тех пор, пока последняя запись, которую я вставил в информационное поле = значение в информационном поле, не изменилась (кажется рекурсивной)

Какие-нибудь мысли? Может быть, вместо того, чтобы называть это info_change (), назвать это другим процедурным событием?

Спасибо, Марти

1 Ответ

0 голосов
/ 10 февраля 2020

Простой пример использования _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


...