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

Excel VBA扫码出入库系统多次扫描同一条码记录逻辑问题求助

解决方案

原代码的核心问题是逻辑固定写死了第二次扫描写入第3列(Offset(0,2)),没有判断当前行已使用的最大列,导致后续扫描始终覆盖固定列的内容。你可以直接替换为下方优化后的宏模块代码,工作表事件代码无需修改:

Sub inout()
    Dim barcode As String
    Dim rng As Range
    Dim rownumber As Long
    Dim nextEmptyCol As Long ' 存储当前行首个空白列号

    barcode = Worksheets("Sheet1").Cells(2, 2).Value
    ' 提前清空输入框,避免异常场景重复触发
    Worksheets("Sheet1").Cells(2, 2).Value = ""

    Set rng = Sheet1.Columns("A:A").Find(What:=barcode, _
    LookIn:=xlFormulas, LookAt:=xlWhole, SearchOrder:=xlByRows, _
    SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False)
    
    If rng Is Nothing Then
        ' 条码不存在,找A列首个空白行新增记录
        rownumber = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row + 1
        Sheet1.Cells(rownumber, "A").Value = barcode
        nextEmptyCol = 2 ' 首次借出记录默认写入B列
    Else
        rownumber = rng.Row
        ' 自动计算当前行已使用的最大列,下一列即为待写入的空白列
        nextEmptyCol = Sheet1.Cells(rownumber, Columns.Count).End(xlToLeft).Column + 1
    End If
    
    ' 写入时间并统一设置格式
    With Sheet1.Cells(rownumber, nextEmptyCol)
        .Value = Now ' 直接用Now代替Date+Time,效果一致代码更简洁
        .NumberFormat = "m/d/yyyy h:mm AM/PM"
    End With
    
    ' 光标自动定位回扫码输入框
    Worksheets("Sheet1").Cells(2, 2).Select
End Sub
改动说明
  • 新增nextEmptyCol变量,每次扫描后自动计算当前条码对应行的首个空白列,不再固定写入第2、3列,支持无限次出入库记录追加
  • 替换Date & " " & Time为Now函数,代码更简洁,时间记录效果完全一致
  • 移除了不必要的Select操作,VBA中直接操作单元格对象比依赖ActiveCell运行效率更高,还能避免界面跳闪
  • 提前清空输入框,避免异常场景下重复触发登记逻辑
  • 优化了空白行查找逻辑,比原代码的Find("")兼容性更强,不会因为A列中间出现空行导致新增行错位

内容的提问来源于stack exchange,提问作者H Jarid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 22:06:03