Excel VBA数据录入IF语句异常:手动添加商品未触发重复校验
问题分析与修复方案
首先,咱们得揪出问题的核心:你的校验逻辑有个致命漏洞——每检查一行不匹配就直接触发添加流程,根本没遍历完所有库存行。比如手动添加的商品在Stock表的后面几行,代码刚检查前几行不匹配就直接弹出添加提示了,根本没机会检查到后面手动新增的那些行!另外,你循环的范围大概率也没覆盖到手动添加的行,这也是原因之一。
修复后的核心逻辑
咱们调整下思路,把校验和添加拆成两步:
- 先遍历Stock表中所有有数据的行,标记是否存在重复商品(按B、C列匹配)
- 遍历结束后,根据标记结果再决定是提示已存在,还是询问是否添加新商品
修复后的完整代码
Sub AddProduct() Dim wsDataEntry As Worksheet, wsStock As Worksheet Dim lastRowStock As Long, i As Long Dim isDuplicate As Boolean Dim answer As VbMsgBoxResult Dim arrayData As Variant Dim t1, t2, t3, t4, t5, t6 ' 假设这些变量已提前定义并赋值 ' 定义工作表对象,让代码更简洁易读 Set wsDataEntry = ThisWorkbook.Worksheets("Data Entry") Set wsStock = ThisWorkbook.Worksheets("Stock") ' 获取Stock表最后一行(包含手动添加的所有行) lastRowStock = wsStock.Cells(wsStock.Rows.Count, "A").End(xlUp).Row isDuplicate = False ' 初始化重复标记 ' 遍历所有库存行(假设第一行是表头,从第二行开始) For i = 2 To lastRowStock ' 忽略大小写和首尾空格,对比B、C列的商品信息 If UCase(Trim(wsDataEntry.Cells(6, "B").Value)) = UCase(Trim(wsStock.Cells(i, "B").Value)) _ And UCase(Trim(wsDataEntry.Cells(6, "C").Value)) = UCase(Trim(wsStock.Cells(i, "C").Value)) Then isDuplicate = True Exit For ' 找到重复就跳出循环,不用继续检查 End If Next i ' 根据标记执行对应逻辑 If isDuplicate Then MsgBox "Product exists", vbOKOnly Else answer = MsgBox("Add new product?", vbOKCancel) If answer = vbCancel Then MsgBox "Cancelled!" Else ' 获取新数据要插入的行号 lastRowStock = wsStock.Cells(wsStock.Rows.Count, "A").End(xlUp).Row + 1 ' 插入新商品数据 arrayData = VBA.Array(t1, t2, t3, t4, t5, t6) wsStock.Cells(lastRowStock, 1).Resize(, 6).Value = arrayData ' 计算G、H列的数值(用新插入的行号,避免引用错误) wsStock.Cells(lastRowStock, "G").Value = wsStock.Cells(lastRowStock, "A").Value * wsStock.Cells(lastRowStock, "D").Value wsStock.Cells(lastRowStock, "H").Value = wsStock.Cells(lastRowStock, "A").Value * wsStock.Cells(lastRowStock, "F").Value MsgBox "Data entry completed" End If End If telos: ' 清理对象,释放内存 Set wsDataEntry = Nothing Set wsStock = Nothing End Sub
关键修复点
- 覆盖所有行:用
Cells(Rows.Count, "A").End(xlUp).Row获取Stock表最后一行,不管是表单还是手动添加的行都能被检查到 - 先标记后判断:用
isDuplicate变量记录是否找到重复,遍历完所有行再做决策,不会中途触发添加流程 - 修正计算行号:原来的代码用遍历的
i计算G、H列,现在改成新插入的行号,避免引用错误 - 代码可读性优化:定义工作表对象,减少重复代码,后续维护更方便
内容的提问来源于stack exchange,提问作者Debbie Mp
相关产品推荐
相关产品推荐

