VBA中TextBox_Change子程序嵌套循环执行后跳回开头问题求助
问题根源与解决方法
你遇到的是事件递归触发的问题:你的代码写在TextBox1_Change事件里,而代码中执行TextBox1.Text = ...修改文本框内容时,会再次触发TextBox1_Change事件,导致子程序反复从头执行,形成无限递归,最终让Excel崩溃。
核心解决步骤
在修改TextBox内容前临时禁用Excel的事件触发,操作完成后再恢复,就能避免递归。修改后的代码如下:
Private Sub TextBox1_Change() ' 临时关闭事件触发,防止递归 Application.EnableEvents = False Dim sQuery As String Dim ReturnData() As Variant Dim wsFleetio As Worksheet Dim Farm As String Set wsFleetio = ThisWorkbook.Worksheets("Test") Farm = wsFleetio.Range("B1").Value ' 构建查询语句 sQuery = "SELECT [KillDate], [FarmName], [LoadType] FROM Loads WHERE ([FarmName] = '" & Farm & "' AND [KillDate] >= DateAdd('yyyy', -1, Date()))" ReturnData = GetMerlinData(sQuery) ' 先清空文本框,避免重复内容叠加 TextBox1.Text = "" Dim i As Long, j As Long For i = 0 To UBound(ReturnData, 2) For j = 0 To 2 ' 直接用ReturnData,不用额外转存到FarmData,简化代码 TextBox1.Text = TextBox1.Text & ReturnData(j, i) & "---" Next j TextBox1.Text = TextBox1.Text & vbCrLf Next i ' 恢复事件触发 Application.EnableEvents = True End Sub
额外优化建议
- 去掉了冗余的
FarmData数组,直接使用查询返回的ReturnData,减少代码复杂度和内存占用 - 新增错误处理逻辑,防止代码报错后事件一直处于禁用状态:
Private Sub TextBox1_Change() Application.EnableEvents = False ' 错误捕获,确保事件能恢复 On Error GoTo ErrorHandler ' ... 上述核心代码 ... ErrorHandler: Application.EnableEvents = True If Err.Number <> 0 Then MsgBox "执行出错:" & Err.Description, vbExclamation End If End Sub
内容的提问来源于stack exchange,提问作者Cool_Coder
相关产品推荐
相关产品推荐

