Excel VBA 出入库登记单ElseIf判断语句不生效问题排查
问题排查
你代码的核心错误有3个:
- 条件判断顺序完全错误:第一个
If的判断逻辑完全不成立,rng是Range对象,直接和True对比本身就是逻辑错误,且你先写了这个错误判断,直接把条目存在的所有场景都拦截了,后面的ElseIf永远不会触发,这就是你说的新增判断不生效的根本原因。 - 缺少状态判断逻辑:你没有判断已存在的条目当前是「已借出」还是「已归还」状态,自然没办法区分操作是要写借出时间还是归还时间。
- 大量使用
Select、ActiveCell依赖激活状态的语法,很容易因为用户手动选中单元格导致逻辑混乱。
修正后代码
Sub inout() Dim barcode As String Dim rng As Range Dim lastRow As Long ' 获取录入的条码 barcode = Worksheets("Sheet1").Cells(2, 2).Value If Trim(barcode) = "" Then Exit Sub ' 空值直接退出 ' 查找条码是否存在 Set rng = Sheet1.Columns("A:A").Find(What:=barcode, _ LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _ SearchDirection:=xlNext, MatchCase:=False, SearchFormat:=False) If Not rng Is Nothing Then ' 条码已存在,判断状态:假设B列是借出时间,C列是归还时间 If rng.Offset(0, 1).Value = "" Then ' 借出时间为空,执行借出操作,写B列 rng.Offset(0, 1).Value = Now() rng.Offset(0, 1).NumberFormat = "m/d/yyyy h:mm AM/PM" rng.Offset(0, 2).ClearContents ' 清空归还时间 Else ' 借出时间不为空,执行归还操作,写C列 rng.Offset(0, 2).Value = Now() rng.Offset(0, 2).NumberFormat = "m/d/yyyy h:mm AM/PM" rng.Offset(0, 3).Value = "TOOL CRIB" ' 保留原有登记人逻辑 End If Else ' 条码不存在,新增条目 lastRow = Sheet1.Cells(Rows.Count, "A").End(xlUp).Row + 1 ' 找A列最后空行 Sheet1.Cells(lastRow, "A").Value = barcode ' 写入借出时间 Sheet1.Cells(lastRow, "B").Value = Now() Sheet1.Cells(lastRow, "B").NumberFormat = "m/d/yyyy h:mm AM/PM" End If ' 清空输入框,定位回输入单元格 Worksheets("Sheet1").Cells(2, 2).ClearContents Worksheets("Sheet1").Cells(2, 2).Select End Sub
逻辑说明
- 先判断条码是否为空,避免空值执行无效逻辑
- 优先判断条码是否存在,不存在直接走新增逻辑,写入借出时间
- 条码存在时,判断借出时间列(B列)是否为空:空则说明是首次借出,写借出时间;非空则说明已经借出,本次是归还操作,写归还时间
- 去掉了所有不必要的Select操作,直接基于找到的单元格对象操作,不会受手动选中单元格影响
内容的提问来源于stack exchange,提问作者wben113
相关产品推荐
相关产品推荐

