You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel VBA:UserForm的ListBox在4次单元格修改后停止更新

问题分析

你的代码存在两个关键问题,导致单元格修改4次后新内容无法在ListBox中显示:

  1. 工作表行数引用错误:在Worksheet_Change和UserForm_Initialize中,Rows.Count未限定为Update工作表的行数,导致读取最后一行时误用了当前活动工作表的行数,造成写入或读取逻辑判断错误。
  2. 未禁用事件触发递归:向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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 00:53:31