如何用Excel VBA批量匹配多值复制行至新表?含粘贴与删行需求
优化后的VBA解决方案
以下是满足你所有需求的修改后代码,同时修复了原代码中的逻辑问题:
Sub NYC() Dim wsSource As Worksheet, wsTarget As Worksheet Dim lastRowSource As Long, targetStartRow As Long Dim matchValues As Variant Dim i As Long, processedRows As Long ' 定义需要匹配的51个特定值(替换为你的实际值,继续补充剩余项) matchValues = Array("值1", "值2", "值3", "值4", "值5", _ "值6", "值7", "值8", "值9", "值10", _ ' ... 此处添加剩余41个值 ... "值51") ' 初始化工作表引用 Set wsSource = ThisWorkbook.Worksheets("DLS-Route") Set wsTarget = ThisWorkbook.Worksheets("NYC Source") ' 目标表固定从第3行开始粘贴(表头下留空行) targetStartRow = 3 ' 获取源表B列最后一行数据的行号 lastRowSource = wsSource.Cells(wsSource.Rows.Count, "B").End(xlUp).Row ' 关闭屏幕更新与事件触发,提升执行效率 Application.ScreenUpdating = False Application.EnableEvents = False ' 从下往上遍历,避免删除行导致的索引错位 For i = lastRowSource To 1 Step -1 ' 判断当前单元格值是否在匹配列表中 If Not IsError(Application.Match(wsSource.Cells(i, "B").Value, matchValues, 0)) Then ' 复制行到目标表的下一个空行 wsSource.Rows(i).Copy Destination:=wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Offset(1) ' 确保首次粘贴从第3行开始 If wsTarget.Cells(targetStartRow, "A").Value = "" Then wsTarget.Rows(wsTarget.Cells(wsTarget.Rows.Count, "A").End(xlUp).Row).Cut _ Destination:=wsTarget.Cells(targetStartRow, "A") End If ' 删除源表中的匹配行 wsSource.Rows(i).Delete processedRows = processedRows + 1 End If Next i ' 恢复系统设置 Application.ScreenUpdating = True Application.EnableEvents = True ' 操作完成提示(可选) MsgBox "操作完成,共处理 " & processedRows & " 行数据", vbInformation End Sub
功能说明
- 多值匹配:通过
matchValues数组存储51个目标值,使用Application.Match快速校验,比逐个判断更简洁易维护 - 固定起始粘贴行:强制目标表从第3行开始粘贴,若目标表原有数据则接在数据末尾,始终保持表头下留空行
- 安全删除源行:采用从下往上遍历的方式,避免删除行后后续行索引错乱导致的漏删问题
- 性能优化:关闭屏幕更新和事件触发,减少执行过程中的屏幕闪烁,提升运行速度
内容的提问来源于stack exchange,提问作者Giovanni03
相关产品推荐
相关产品推荐

