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

Excel VBA求助:Scan表U列出现1时自动在同行列V录入发生时间

问题根因
  • Worksheet_Change 事件仅响应用户手动修改单元格的操作,U列值为公式计算生成,变动不会触发该事件,是代码失效的核心原因
  • 原代码存在多处语法错误:
    • 工作表集合拼写错误:ThisWorkbook.Worksheet 应为 ThisWorkbook.Worksheets
    • 单元格引用语法错误:Target.Range(.Row, 22) 写法不合法,未正确指向对应行的V列
    • 缺少U列值为1的判断逻辑,只要U列变动就会写入时间,不符合需求
可行解决方案

推荐监听用户实际操作的B列修改事件,每次扫描条码修改B列后,U列会自动重算,此时直接判断对应行U列的值即可满足需求。
将以下代码放入「Scan」工作表的代码模块即可生效:

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 限定仅处理扫描条码的B列3-1050行区域
    Dim OperateRng As Range
    Set OperateRng = Intersect(Target, Me.Range("B3:B1050"))
    If OperateRng Is Nothing Then Exit Sub
    
    ' 关闭事件防止重复触发递归
    Application.EnableEvents = False
    
    Dim editCell As Range
    For Each editCell In OperateRng
        Dim uVal As Variant
        uVal = Me.Cells(editCell.Row, "U").Value
        ' 仅当U列值为1且V列未记录过时写入时间,保证时间固定不被覆盖
        If uVal = 1 And Me.Cells(editCell.Row, "V").Value = "" Then
            Me.Cells(editCell.Row, "V").Value = Now()
            ' 可选:自定义时间格式,取消下方注释即可生效
            ' Me.Cells(editCell.Row, "V").NumberFormat = "yyyy-mm-dd hh:mm:ss"
        End If
    Next
    
    ' 恢复事件触发
    Application.EnableEvents = True
End Sub
补充说明
  • 代码中的Me指代当前代码所在的工作表,只要将代码放在「Scan」工作表的代码模块,无需额外指定工作表名,避免拼写错误
  • 若需要监听U列公式的自动变动,可改用Worksheet_Calculate事件,但该事件无修改目标参数,需要全量遍历U3:U1050区域,数据量大时性能低于监听B列的方案

内容的提问来源于stack exchange,提问作者Ondrej Sabol

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 18:57:02