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
相关产品推荐
相关产品推荐

