使用VBA循环移动行到其他工作表时遗漏一行的问题
问题排查与解决方案
核心原因:遍历过程中剪切行导致的范围偏移
你的代码用For Each mycell In myrange从上到下遍历A3:A916,执行Cut操作时,原Sheet1中被剪切的行会被删除,后续行会向上填补空缺。比如:
- 处理完A3(第3行)并剪切后,原第4行(A4)会变成新的A3
- 但
For Each是基于初始的Range集合遍历,此时会跳过新的A3(原第4行),直接处理下一个初始元素(原A5),导致原第4行永远不会被处理。
其他可能的次要原因
- A4单元格值异常:如果A4是空值、错误值(如
#N/A),会导致所有If条件都不触发,该行不会被转移。可以手动检查Sheet1第4行A列的值是否符合>=24/12<=值<24/<12的任一区间。 - 目标行定位错误:原代码中定位目标Sheet起始行的写法冗余且易出错,正确获取空白行首行的方式应为
Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Offset(1, 0),原写法在目标Sheet为空时可能定位到超出Excel行限制的位置,导致剪切失败。
修正后的代码
Sub ap() Dim myrow As Long Dim lastRow As Long Dim targetSheet As Worksheet ' 清空目标Sheet Worksheets("sheet2").Range("a1:z10000").Clear Worksheets("sheet3").Range("a1:z10000").Clear Worksheets("sheet4").Range("a1:z10000").Clear Worksheets("sheet5").Range("a1:z10000").Clear lastRow = 916 ' 对应原Range的结束行 ' 从下往上遍历,避免剪切行导致的偏移 For myrow = lastRow To 3 Step -1 With Worksheets("sheet1").Cells(myrow, "A") Select Case .Value Case Is >= 24 .Interior.ColorIndex = 4 Set targetSheet = Worksheets("sheet2") Case 12 To 23.999 ' 明确区间避免边界问题 .Interior.ColorIndex = 5 Set targetSheet = Worksheets("sheet3") Case Is < 12 .Interior.ColorIndex = 6 Set targetSheet = Worksheets("sheet4") Case Else ' 处理空值或错误值 .Interior.ColorIndex = 3 ' 标记红色方便排查 Set targetSheet = Nothing ' 不转移 End Select End With If Not targetSheet Is Nothing Then ' 正确定位目标Sheet的空白行 Dim targetRow As Long targetRow = targetSheet.Cells(targetSheet.Rows.Count, "A").End(xlUp).Row + 1 Worksheets("sheet1").Rows(myrow).Resize(1, 16).Cut Destination:=targetSheet.Cells(targetRow, "A") End If Next myrow ' 自动列宽 Worksheets("sheet2").Columns.AutoFit Worksheets("sheet3").Columns.AutoFit Worksheets("sheet4").Columns.AutoFit End Sub
关键改进点
- 改为从下往上遍历行,彻底避免剪切后行偏移导致的遍历遗漏
- 用
Select Case替代嵌套If,逻辑更清晰,同时覆盖异常值场景 - 简化目标行定位逻辑,解决Sheet为空时的定位错误问题
- 新增异常值标记,快速定位未转移的行
内容的提问来源于stack exchange,提问作者Morteza Khavari
相关产品推荐
相关产品推荐

