Excel VBA问题:按单元格内容剪切行至另一工作表仅成功一行
VBA批量剪切行问题的修复
问题根源
- 每次调用
Find都从ED列开头重新查找,未指定从当前找到的单元格之后继续,导致处理完第一行后,后续查找要么重复定位到已处理位置,要么漏掉其他匹配行。 - 执行
Cut后又调用Delete属于多余操作——Cut已经把原行移到目标表,原位置变为空行,再Delete会让下方行上移,打乱查找的行号逻辑。
修正后的代码
Dim fCell As Range Dim firstFoundAddr As String Dim wsSearch As Worksheet Dim wsDest As Worksheet Set wsSearch = Worksheets("Sheet1") Set wsDest = Worksheets("Sheet2") With wsSearch.Range("ED:ED") ' 第一次查找目标文本 Set fCell = .Find(what:="Balance Forward from EPIC", LookIn:=xlValues, lookat:=xlWhole, MatchCase:=False) If Not fCell Is Nothing Then firstFoundAddr = fCell.Address ' 记录第一个匹配单元格地址,防止无限循环 Do ' 剪切行到Sheet2的最后一行下方 fCell.EntireRow.Cut Destination:=wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1) ' 从当前单元格之后查找下一个匹配项 Set fCell = .FindNext(After:=fCell) ' 回到第一个匹配单元格时,说明遍历完成,退出循环 If fCell.Address = firstFoundAddr Then Exit Do Loop Until fCell Is Nothing End If End With
关键修正说明
- 新增
firstFoundAddr记录首个匹配位置,避免因行移动导致查找循环往复。 - 用
FindNext替代重复调用Find,确保每次查找从上一个匹配项之后开始。 - 删除多余的
Delete语句,Cut操作已完成行移动,无需额外删除。 - 明确使用
wsDest.Rows.Count获取目标表总行数,避免与查找区域行数混淆。
内容的提问来源于stack exchange,提问作者Mark
相关产品推荐
相关产品推荐

