寻求Excel VBA解决方案:自动化库存收发的数量增减操作
实现Excel库存自动扣减/归还的方案
1. 准备发放与归还标签页
- 新建两个标签页,分别命名为
Issue(发放)和Return(归还) Issue页表头设置:Type、Inventory ID、Name、Size、Quantity Issued、Status(用于反馈操作结果)Return页表头设置:Type、Inventory ID、Name、Size、Quantity Returned、Status
2. VBA自动更新方案(高效批量处理)
发放页自动扣减库存代码
右键点击Issue标签页 → 选择「查看代码」,粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim lookupName As String, lookupSize As String Dim qtyIssued As Integer Dim targetCell As Range ' 仅监听Quantity Issued列(假设为E列,按需调整) If Target.Column <> 5 Or Target.Row = 1 Then Exit Sub lookupName = Target.Offset(0, -2).Value ' 读取Name字段(C列) lookupSize = Target.Offset(0, -1).Value ' 读取Size字段(D列) qtyIssued = Target.Value If qtyIssued <= 0 Then Target.Offset(0, 1).Value = "请输入正数" Exit Sub End If ' 通过Type字段匹配对应库存标签页(Type在B列) On Error Resume Next Set ws = ThisWorkbook.Worksheets(Target.Offset(0, -3).Value) On Error GoTo 0 If ws Is Nothing Then Target.Offset(0, 1).Value = "对应库存标签页不存在" Exit Sub End If ' 查找Name+Size匹配的库存行 Set targetCell = ws.Range("C:C").Find(What:=lookupName, LookIn:=xlValues, LookAt:=xlWhole) Do While Not targetCell Is Nothing If ws.Range("D" & targetCell.Row).Value = lookupSize Then ' 扣减库存(quantity in stock在E列,按需调整) If ws.Range("E" & targetCell.Row).Value >= qtyIssued Then ws.Range("E" & targetCell.Row).Value = ws.Range("E" & targetCell.Row).Value - qtyIssued Target.Offset(0, 1).Value = "库存已扣减" Else Target.Offset(0, 1).Value = "库存不足" End If Exit Do End If Set targetCell = ws.Range("C:C").FindNext(targetCell) Loop If targetCell Is Nothing Then Target.Offset(0, 1).Value = "未找到匹配库存项" End If End Sub
归还页自动增加库存代码
右键点击Return标签页 → 选择「查看代码」,粘贴以下代码:
Private Sub Worksheet_Change(ByVal Target As Range) Dim ws As Worksheet Dim lookupName As String, lookupSize As String Dim qtyReturned As Integer Dim targetCell As Range ' 仅监听Quantity Returned列(假设为E列,按需调整) If Target.Column <> 5 Or Target.Row = 1 Then Exit Sub lookupName = Target.Offset(0, -2).Value ' 读取Name字段(C列) lookupSize = Target.Offset(0, -1).Value ' 读取Size字段(D列) qtyReturned = Target.Value If qtyReturned <= 0 Then Target.Offset(0, 1).Value = "请输入正数" Exit Sub End If ' 通过Type字段匹配对应库存标签页(Type在B列) On Error Resume Next Set ws = ThisWorkbook.Worksheets(Target.Offset(0, -3).Value) On Error GoTo 0 If ws Is Nothing Then Target.Offset(0, 1).Value = "对应库存标签页不存在" Exit Sub End If ' 查找Name+Size匹配的库存行 Set targetCell = ws.Range("C:C").Find(What:=lookupName, LookIn:=xlValues, LookAt:=xlWhole) Do While Not targetCell Is Nothing If ws.Range("D" & targetCell.Row).Value = lookupSize Then ' 增加库存(quantity in stock在E列,按需调整) ws.Range("E" & targetCell.Row).Value = ws.Range("E" & targetCell.Row).Value + qtyReturned Target.Offset(0, 1).Value = "库存已增加" Exit Do End If Set targetCell = ws.Range("C:C").FindNext(targetCell) Loop If targetCell Is Nothing Then Target.Offset(0, 1).Value = "未找到匹配库存项" End If End Sub
3. 代码适配调整
- 列位调整:如果你的
quantity in stock、Size等字段不在代码默认的列,修改对应单元格引用(比如ws.Range("E" & targetCell.Row)改为实际列号) - 标签页匹配:确保
Type字段的值和库存标签页名称完全一致(例如Type值为headware,对应标签页名也为headware) - 唯一性校验:保证每个库存页内的
Name+Size组合唯一,避免重复匹配错误
4. 非VBA公式方案(适合新手)
若不想使用VBA,可通过SUMIFS公式实现库存自动计算:
在库存页的quantity in stock单元格(比如E2)输入以下公式,下拉覆盖所有库存行:
=原始库存值 - SUMIFS(Issue!$E:$E, Issue!$C:$C, $C2, Issue!$D:$D, $D2, Issue!$B:$B, "headware") + SUMIFS(Return!$E:$E, Return!$C:$C, $C2, Return!$D:$D, $D2, Return!$B:$B, "headware")
- 替换
原始库存值为该单元格原有的库存数量 - 替换
"headware"为当前库存标签页的名称 - 确保Excel开启自动重算(文件→选项→公式→勾选「自动重算」)
内容的提问来源于stack exchange,提问作者Brynne
相关产品推荐
相关产品推荐

