Excel VBA扫码登记代码报错误91,求实现查找已有条目更新时间功能
错误原因
错误91(对象变量或With块变量未设置)的触发点在第一行判断语句:
If Not (rng Is Nothing) Or rng.Offset(0, 2) > 0 Then
VBA的逻辑运算不会短路,当Find未找到匹配条码、rng为Nothing时,依然会执行后半段的rng.Offset(0, 2) > 0判断,访问未初始化的对象就会抛出错误91。同时原代码的逻辑判断顺序、时间赋值也存在问题,和预期业务逻辑不匹配。
修正后完整代码
Sub inout() Dim barcode As String Dim rng As Range Dim ws As Worksheet Set ws = ThisWorkbook.Worksheets("Sheet1") barcode = Trim(ws.Cells(2, 2).Value) ' 加Trim避免空格导致匹配失败 If barcode = "" Then Exit Sub ' 空条码直接退出 ' 在A列查找匹配条码 Set rng = ws.Columns("A").Find(What:=barcode, _ LookIn:=xlValues, LookAt:=xlWhole, _ SearchOrder:=xlByRows, SearchDirection:=xlPrevious, ' 找最后一次出现的条码,避免重复条目匹配异常 MatchCase:=False, SearchFormat:=False) If rng Is Nothing Then ' 未找到匹配条码,新增签出记录 Set rng = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1, 0) rng.Value = barcode rng.Offset(0, 1).NumberFormat = "m/d/yyyy h:mm AM/PM" rng.Offset(0, 1).Value = Now ' 用Now存完整日期时间,Date仅存日期 rng.Offset(0, 2).ClearContents Else ' 找到匹配条码,判断是否已有签入时间 If rng.Offset(0, 2).Value <> "" Then ' 已有签入时间,新增签出记录 Set rng = ws.Cells(ws.Rows.Count, "A").End(xlUp).Offset(1, 0) rng.Value = barcode rng.Offset(0, 1).NumberFormat = "m/d/yyyy h:mm AM/PM" rng.Offset(0, 1).Value = Now rng.Offset(0, 2).ClearContents Else ' 无签入时间,更新当前条目的签入时间 rng.Offset(0, 2).NumberFormat = "m/d/yyyy h:mm AM/PM" rng.Offset(0, 2).Value = Now End If End If ws.Cells(2, 2).ClearContents End Sub
核心修改点
- 调整逻辑判断顺序,先判断
rng是否为Nothing,避免访问未初始化对象 - 将
Find的搜索方向改为从下往上,匹配最新的条码记录,避免多笔重复条码匹配旧记录 - 新增条码非空校验、去除条码首尾空格,避免异常匹配
- 时间赋值改用
Now函数,保留时分秒信息,符合出入库登记的时间精度要求 - 合并冗余的新增签出逻辑,代码更简洁易维护
内容的提问来源于stack exchange,提问作者wben113
相关产品推荐
相关产品推荐

