2017-01-01 1 views
0

Предположим, что у меня были combobox1, 2, 3 и текстовое поле1 в пользовательской форме. After update Событие было связано с combobox1. Когда нажата клавиша Tab, было запущено событие after update (заполнение списков 2 и 3). В коде этого события, непосредственно перед выходом, было textbox1.setfocus, чтобы пропустить ввод других кобобок в порядке вклада (combobox 1,2,3, textbox1). Все прошло отлично.VBA Excel Выход из события обновления после события введите событие

Когда я добавил еще одно combobox, которое теперь является combobox2, порядок вкладок был изменен на 1,2,3,4. After update все еще ассоциируется с combobox1 и textbox1.setfocus - последняя строка перед выходом sub. К сожалению, когда выйдет выходная линия для after update, она запускает combobox3 enter event и перемещает фокус на combobox3. Это более непонятно, потому что порядок табуляции - combobox1,2,3,4, поэтому он также пропускает порядок вкладок.

Когда я отлаживал код, фокус на textbox1 был установлен так, как он должен, но все же только когда выполняется выход sub, строка кода перемещается в combobox3 enter event ... Любые советы, оцененные.

+0

'Application.Enableevents = False' - предотвращать запуск других событий. Перед 'Exit Sub' или' End Sub' снова включите события. – vacip

+0

@vacip Это может помочь, но все же - как получилось, что он начал вести себя так? – kkris77

+0

@vacip Еще один вопрос для вас, ваше решение - когда я должен установить событие enable в false, а когда - в true? Мне нужно выполнить после события обновления, но введите пожары событий, только когда «exit sub» выполняется после события aupdate, и вы предложили включить события включения непосредственно перед «exit sub». – kkris77

ответ

1

в вашем UserForm кода панели действуют следующим образом:

  • пользовательской формы области видимости Boolean переменной

    , следовательно, место это до того кода Sub/Function

    Dim SetTextBox1Focus As Boolean 
    
  • в ваш ComboBox1_AfterUpdate() обработчик события:

    Private Sub ComboBox1_AfterUpdate() 
        If (condition that checks if the data entered in combobox1 exists in the database) is True Then 
    
         ... 
         your code to fill comboboxes 2, 3 ad 4 
         ... 
    
         Me.TextBox1.SetFocus 
         SetTextBox1Focus = True '<--| "flag" TextBox1 to receive the focus 
        End If 
    End Sub 
    
  • добавить обработчик Enter событий для всех элементов управления UserForm вкладка, чей индекс находится между ComboBox1 и TexBox1

    , например, предполагая те ComboBox2, ComboBox3 и ComboBox4

    Private Sub ComboBox2_Enter() 
        CheckSetTextBox1Focus 
    End Sub 
    
    
    Private Sub ComboBox3_Enter() 
        CheckSetTextBox1Focus 
    End Sub 
    
    
    Private Sub ComboBox4_Enter() 
        CheckSetTextBox1Focus 
    End Sub 
    
  • добавить после CheckSetTextBox1Focus() Под

    Sub CheckSetTextBox1Focus() 
        If SetTextBox1Focus Then 
         Me.TextBox1.SetFocus 
         SetTextBox1Focus = False 
        End If 
    End Sub 
    
+0

@ kkris77, вы пройти через это? – user3598756

+0

У меня не было времени недавно, я попробую в выходные – kkris77

+0

Спасибо, он решил мое дело! – kkris77