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

