【问题标题】:VBA Excel Exiting after update event fires enter event更新事件触发输入事件后VBA Excel退出
【发布时间】:2017-05-16 01:32:25
【问题描述】:

假设我在用户窗体上有一个combobox1、2、3 和一个textbox1。 After update 事件与组合框1 相关联。当按下 Tab 键时,after update 事件被触发(填充组合框 2 和 3)。在此事件的代码中,就在 exit sub 之前有 textbox1.setfocus 以跳过按 tab 顺序输入其他 cobobox(组合框 1、2、3、textbox1)。效果很好。

当我添加另一个组合框(现在是组合框 2)时,选项卡顺序更改为 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 输入事件... 任何提示表示赞赏。

【问题讨论】:

  • Application.Enableevents=False - 防止触发其他事件。在Exit SubEnd Sub 之前重新开启事件。
  • @vacip 这可能会有所帮助,但仍然 - 为什么它开始表现得像这样?
  • @vacip 对您的解决方案还有一个问题 - 我应该何时将启用事件设置为 false 以及何时设置为 true ?我需要在更新事件之后执行,但是在更新事件之后执行“退出子”时才会触发输入事件,并且您建议在“退出子”之前打开启用事件。
  • 嗯,我不确定我是否完全理解。如果要强制焦点在制表符后保持在同一控件中,为什么不禁用制表位?也许 EnableEvents 对你不利;你可以尝试在不同的事件中设置和检查全局标志来决定它们是否应该触发......
  • 这就是它的工作原理:如果在combobox1中输入的数据存在于数据库中,则combobox 2,3,4会自动填充,所以我希望焦点跳过进入这个comboboxes(根据tab顺序)然后移到textbox1。但是如果在comobox1中输入的数据在数据库中不存在,用户必须在输入textbox1之前输入combobox 2,3,4的数据,在这种情况下我想使用tab顺序的好处。

标签: excel vba events


【解决方案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
    
  • 为标签索引在ComboBox1TexBox1之间的所有用户窗体控件添加一个Enter事件处理程序

    例如,假设它们是 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
    

【讨论】:

  • @kkris77,你通过了吗?
  • 最近没时间,周末试试
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-24
  • 2019-12-28
  • 2021-02-10
  • 2013-04-05
  • 1970-01-01
相关资源
最近更新 更多