实验室库存工作簿VBA需求:选中实验室后自动转移对应行数据
实验室库存数据自动转移VBA代码完善方案
核心实现功能
- 当Master表M列选中目标实验室名称时,自动将该行A-G列数据同步到对应实验室工作表的最后一行
- 支持物品跨实验室转移:若该物品已存在于其他实验室表中,会先从原表删除,再同步到新选中的实验室表
- 基于物品唯一标识(默认A列)匹配数据,确保转移准确性
完整VBA代码
将以下代码粘贴到Master工作表的代码模块中(按Alt+F11打开VBA编辑器,双击左侧工程窗口里的Master表):
Private Sub Worksheet_Change(ByVal Target As Range) ' 仅处理M列的单单元格修改 If Target.Column <> 13 Or Target.Cells.Count > 1 Then Exit Sub Dim wsTarget As Worksheet Dim wsSource As Worksheet Dim lastRow As Long Dim findRow As Range Dim itemID As String Dim labName As String ' 关闭事件触发,避免循环执行 Application.EnableEvents = False ' 获取当前物品唯一ID(A列)和目标实验室名称 itemID = Target.Offset(0, -12).Value ' A列是第1列,M列是13列,偏移-12 labName = Target.Value ' 跳过空值 If itemID = "" Or labName = "" Then Application.EnableEvents = True Exit Sub End If ' 检查目标实验室工作表是否存在 On Error Resume Next Set wsTarget = ThisWorkbook.Worksheets(labName) On Error GoTo 0 If wsTarget Is Nothing Then MsgBox "不存在名为" & labName & "的工作表,请检查名称!", vbExclamation Application.EnableEvents = True Exit Sub End If ' 遍历所有实验室工作表,查找并删除该物品的旧记录 For Each wsSource In ThisWorkbook.Worksheets ' 跳过Master表和目标表 If wsSource.Name <> "Master" And wsSource.Name <> labName Then Set findRow = wsSource.Columns(1).Find(What:=itemID, LookIn:=xlValues, LookAt:=xlWhole) If Not findRow Is Nothing Then findRow.EntireRow.Delete End If End If Next wsSource ' 将数据复制到目标实验室表的最后一行 lastRow = wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row + 1 Target.Offset(0, -12).Resize(1, 7).Copy ' 复制A-G列(共7列) wsTarget.Cells(lastRow, "A").PasteSpecial Paste:=xlPasteValuesAndNumberFormats Application.CutCopyMode = False ' 可选:清空Master表当前行的M列,避免重复触发 Target.ClearContents ' 恢复事件触发 Application.EnableEvents = True End Sub
使用说明
- 确保所有实验室工作表的名称(如
Lab 01)与Master表M列的下拉选项完全一致,大小写、空格都要匹配 - 默认以A列作为物品唯一标识,若你的唯一标识在其他列,修改代码中
itemID = Target.Offset(0, -12).Value的偏移量(比如B列就是-11) - 测试前请备份工作簿,避免数据丢失
注意事项
- 如果不需要自动删除原实验室的记录,可以删除代码中
遍历所有实验室工作表的循环部分 - 若需要保留Master表M列的选择记录,删除
Target.ClearContents这一行 - 代码仅处理单单元格修改,批量修改M列不会触发,如需批量处理可单独写批量执行的宏
内容的提问来源于stack exchange,提问作者Yeshi
相关产品推荐
相关产品推荐

