更新事件触发后的VBA Excel退出输入事件

时间:2017-01-01 19:45:53

标签: excel vba events

假设我在userform上有一个combobox1,2,3和一个textbox1。 After update事件与combobox1相关联。按Tab键时after update事件被触发(填充组合框2和3)。在此事件的代码中,就在退出sub之前,textbox1.setfocus跳过了以Tab键顺序输入其他cobobox(组合框1,2,3,textbox1)。它运作得很好。

当我添加另一个现在是combobox2的组合框时,标签顺序更改为1,2,3,4。 After update仍然与combobox1关联,textbox1.setfocus是exit sub之前的最后一行。不幸的是,当执行after update的退出子行时,它会触发combobox3 enter event并将焦点移至combobox3。这更难以理解,因为Tab键顺序是combobox1,2,3,4所以它也会跳过Tab键顺序。

当我对代码进行调试时,对textbox1的关注设置应该如此,但仍然只是在执行exit sub时,代码行被移动到combobox3进入事件... 任何提示赞赏。

1 个答案:

答案 0 :(得分:1)

您的用户窗体代码窗格中的

的行为如下:

  • 用户形式范围Boolean变量

    因此,将此放在任何子/功能代码

    之前
    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事件处理程序,其标签索引介于ComboBox1TexBox1之间

    例如,假设这些是ComboBox2ComboBox3ComboBox4

    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