Excel VBA:UserForm的ListBox在4次单元格修改后停止更新
问题分析
你的代码存在两个关键问题,导致单元格修改4次后新内容无法在ListBox中显示:
- 工作表行数引用错误:在
Worksheet_Change和UserForm_Initialize中,Rows.Count未限定为Update工作表的行数,导致读取最后一行时误用了当前活动工作表的行数,造成写入或读取逻辑判断错误。 - 未禁用事件触发递归:向
Update工作表写入记录时,会触发该工作表的Change事件(即使未编写对应代码,也可能引发异常中断),干扰正常的记录写入流程。
修复后的代码
1. 跟踪工作表代码(原数据工作表,如Sheet1)
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) celaddress = Target.Address colonne = Target.Column UserForm1.Show Cancel = True ' 取消双击进入编辑模式的默认行为,优化体验 Target.Offset(1, 0).Select End Sub Private Sub Worksheet_Change(ByVal Target As Range) If Target.Count <> 1 Then Exit Sub If Target.Value = "" Then Exit Sub ' 空值不记录 Dim r As String, c As Integer r = Target.Address & ")" & Target.Value c = Target.Column Application.EnableEvents = False ' 禁用事件,防止递归触发 With Worksheets("Update") Dim dl As Long ' 正确引用Update工作表的总行数 dl = .Cells(.Rows.Count, c).End(xlUp).Row ' 处理列第一行为空的初始情况 If dl = 1 And .Cells(1, c).Value = "" Then .Cells(1, c).Value = r Else ' 避免重复记录相同内容 If .Cells(dl, c).Value <> r Then .Cells(dl + 1, c).Value = r End If End If End With Application.EnableEvents = True ' 恢复事件触发 End Sub
2. UserForm代码
Private Sub UserForm_Initialize() Me.Caption = "Historique des valeurs" ListBox1.Clear ' 清空列表框,防止重复加载历史记录 With Worksheets("Update") Dim lastRow As Long, i As Long ' 正确引用Update工作表的总行数 lastRow = .Cells(.Rows.Count, colonne).End(xlUp).Row ' 从第一行开始遍历(若有表头则改为i=2) For i = 1 To lastRow Dim r As String, s As Integer r = .Cells(i, colonne).Value s = InStr(r, ")") If s <> 0 Then If Left(r, s - 1) = celaddress Then ListBox1.AddItem Mid(r, s + 1) End If End If Next i End With End Sub
3. 模块代码(保持不变)
Public celaddress As String, colonne As Integer
额外优化说明
- 新增
Cancel = True避免双击单元格时同时弹出窗体和进入编辑模式,提升操作流畅度。 - 加入
ListBox1.Clear确保每次打开窗体时列表框为空,不会重复加载历史内容。 - 补充了
Update工作表列第一行为空的处理逻辑,避免初始记录写入时跳过第一行。
内容的提问来源于stack exchange,提问作者AB0600
相关产品推荐
相关产品推荐

