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

基于Excel VBA的仓库物流拣货单模板开发问题求助

仓库拣货单Excel VBA模板全流程实现

基础规则匹配配置

  • 第1行预设表头:依次在A1、B1、C1、D1单元格填写“零件号”“数量”“库位”“扫描时间戳”,符合表头固定在首行的要求
  • 解锁扫描录入区:选中A2:C1000的可编辑范围,右键打开单元格格式设置→保护选项卡,取消“锁定”勾选,为后续全表保护留出入录权限
  • 全表保护逻辑:开启工作表保护时,仅保留刚才解锁的A:C列区域可编辑,其余所有单元格完全锁定,匹配扫描区外全保护的要求

核心事件代码(粘贴至对应拣货工作表的代码模块)

操作入口:右键点击工作表标签→选择“查看代码”,将以下两段事件代码粘贴到弹出的代码编辑区

自动时间戳触发逻辑(Worksheet_Change事件)

实现B列数量扫描完成后,自动在同行D列写入当前时间戳,同时累计有效行数,满10行时自动触发拣货单处理流程

Private Sub Worksheet_Change(ByVal Target As Range)
    ' 临时关闭事件触发,防止写入操作递归卡死
    Application.EnableEvents = False
    
    ' 触发判定:改动范围为B列(数量列)、非表头行、输入值非空
    If Not Intersect(Target, Me.Range("B:B")) Is Nothing And Target.Row > 1 And Target.Value <> "" Then
        ' 同行D列写入当前时间戳
        Me.Cells(Target.Row, "D").Value = Now()
        
        ' 统计A列有效录入行数(排除表头)
        Dim validRowCount As Long
        On Error Resume Next ' 空表时跳过统计报错
        validRowCount = Me.Range("A:A").SpecialCells(xlCellTypeConstants).Count - 1
        On Error GoTo 0
        
        ' 累计满10行自动触发处理
        If validRowCount >= 10 Then
            Call ProcessPickingList
        End If
    End If
    
    ' 恢复事件触发
    Application.EnableEvents = True
End Sub

录入区域定位逻辑(Worksheet_SelectionChange事件)

避免误点非录入区时和表保护规则冲突,自动跳转到A列下一个待扫描的空单元格

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    ' 选中范围不在A:C录入区时,自动定位到下一个A列空行
    If Intersect(Target, Me.Range("A:C")) Is Nothing Then
        Range("A" & Cells.Rows.Count).End(xlUp).Offset(1, 0).Select
    End If
End Sub

通用拣货单处理子程序(粘贴至VBA编辑器的标准模块)

操作入口:在VBA编辑器左侧工程栏右键点击当前工作簿→插入→模块,将以下代码粘贴进去。该子程序统一处理文件保存、3份打印、工作表重置逻辑,自动触发和手动按钮触发均调用同一套流程

Sub ProcessPickingList()
    Dim saveTime As String
    Dim savePath As String
    ' 按规则生成文件名:picking_list_ddmmyy_hhmm
    saveTime = Format(Now(), "ddmmyy_hhmm")
    savePath = ThisWorkbook.Path & "\picking_list_" & saveTime
    
    Application.DisplayAlerts = False
    ' *支持xls、txt、csv三种格式,按实际需求切换即可*
    ' 1. 导出xls格式:保留默认行
    Me.SaveAs Filename:=savePath & ".xls", FileFormat:=xlExcel8
    ' 2. 导出txt格式:注释上面xls行,取消下面这行注释
    ' Me.SaveAs Filename:=savePath & ".txt", FileFormat:=xlText
    ' 3. 导出csv格式:注释上面两行,取消下面这行注释
    ' Me.SaveAs Filename:=savePath & ".csv", FileFormat:=xlCSV
    
    ' 调用系统默认打印机打印3份
    Me.PrintOut Copies:=3
    
    ' 重置工作表:清空所有扫描录入内容
    Me.Range("A2:D1000").ClearContents
    ' 重新开启工作表保护(保护密码可自定义替换双引号内内容)
    Me.Protect Password:="", DrawingObjects:=True, Contents:=True, Scenarios:=True
    
    Application.DisplayAlerts = True
    MsgBox "拣货单已保存、完成3份打印,工作表已重置。", vbInformation
End Sub

手动触发配置

  • 在工作表非录入区插入表单按钮,指定绑定宏为ProcessPickingList即可实现不足10行时的手动触发,执行和自动满行完全一致的保存、打印、重置逻辑
  • 按钮放置位置建议避开A:C列录入区,防止扫描枪误触

常见问题排查

  • 时间戳不自动生成:检查宏权限是否开启,确认事件触发开关Application.EnableEvents没有被设置为False
  • 文件保存路径报错:提前确认模板文件已保存在本地可读写路径,不要从只读临时目录直接打开运行
  • 表保护失效:确认所有非录入区单元格已勾选“锁定”选项,再执行保护操作
  • 打印份数不符:核对PrintOut方法的Copies参数设置,避免和系统默认打印份数配置冲突

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.22 14:15:02