【问题标题】:excel vba userform afterupdate fires when text box cleared清除文本框时触发excel vba userform afterupdate
【发布时间】:2020-07-03 12:45:32
【问题描述】:

我有一个带有 5 个文本框的简单用户表单。我可以使用“添加”命令按钮处理数据,但是,考虑到一个会话中可能有 100 个条目,如果使用 sub [last textbox]_afterupdate() 触发该过程会更快更容易。

问题:清除文本框时,最后一个会再次触发该过程。代码如下:

Private Sub txtagainst2_afterupdate()


Set rTeam = [A4:A50].Find(txtTeam, lookat:=xlWhole)
Set rTeam = rTeam.Resize(1, 15)
With rTeam
    code to do stuff with the textbox values
End With
txtTeam = ""
txtFor1 = ""
txtAgainst1 = ""
txtFor2 = ""
txtAgainst2 = ""
txtTeam.SetFocus

End Sub

我尝试了几种可能性,但无法破解。

我们将不胜感激任何建议或解决方案。

谢谢你,彼得

【问题讨论】:

    标签: excel vba controls userform


    【解决方案1】:

    为防止代码自行触发(或任何其他代码),您需要暂时禁用触发事件运行的代码行周围的事件:

    不仅仅是:

    txtAgainst2 = ""
    

    用途:

    Application.EnableEvents = False
    txtAgainst2 = ""
    Application.EnableEvents = True
    

    这将防止在更新文本框时触发“AfterUpdate”事件。

    【讨论】:

      【解决方案2】:

      迈克尔。谢谢 您的解决方案是我在发布之前尝试过的解决方案,但由于某种原因,单步执行返回到程序的开头并再次运行(如前所述)。我刚才又试了一次,结果相同。第二次没有更新,因为txtAgainst2为空。

      但是...在过程开始时尝试了一个 if 语句(如下)。必须将除文本框 tabstop 之外的所有内容都设置为 =false,因为不会将焦点设置为 textbox1。这似乎有效。仍然不确定原因。

      private sub txtagainst2_afterupdate()

      If txtAgainst2 = "" Then GoTo handler:
      
      Set rTeam = [A4:A50].Find(txtTeam, lookat:=xlWhole)
      Set rTeam = rTeam.Resize(1, 15)
      With rTeam
      do stuff
      End With
      txtTeam = ""
      txtFor1 = ""
      txtAgainst1 = ""
      txtFor2 = ""
      txtAgainst2 = ""
      txtTeam.SetFocus
      Exit Sub
      

      处理程序: txtTeam.SetFocus 退出子 结束子

      再次感谢您的帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-10
        • 1970-01-01
        • 1970-01-01
        • 2015-06-19
        • 1970-01-01
        • 1970-01-01
        • 2011-05-23
        相关资源
        最近更新 更多