遍历多工作表循环时如何正确引用活动单元格并复制符合条件行?
问题分析与解决方案
问题根源
你的代码存在两个核心问题:
- 遍历范围是
A5:W358的所有单元格,同一行会被重复检查23次(A到W列),完全冗余; - 单元格定位写法错误:
srcSheet.Range(i, "B")会生成从单元格i到B列的区域,无法正确获取当前行B列的值;srcSheet.Cells(i)用法错误,Cells需要行号+列号参数,不能直接传入Range对象,这也是导致复制第1行的直接原因。
修正后的代码(推荐)
改成按行遍历,只检查每行的B列和O列,效率更高且逻辑清晰:
Sub RunReport() Dim srcSheet As Worksheet Dim rptSheet As Worksheet Dim rowNum As Long Dim srcSheets As Variant Set rptSheet = ThisWorkbook.Sheets("Report") Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD")) For Each srcSheet In srcSheets For rowNum = 5 To 358 With srcSheet If .Cells(rowNum, "B").Value <> "" And .Cells(rowNum, "O").Value = "" Then .Rows(rowNum).Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0) End If End With Next rowNum Next srcSheet End Sub
关键修正点
- 用
rowNum遍历第5到358行,避免重复检查同一行的多个单元格; - 通过
.Cells(rowNum, "B")和.Cells(rowNum, "O")精准定位当前行的目标列; - 用
.Rows(rowNum).Copy正确复制整行; With srcSheet简化代码,减少重复引用。
备选方案(遍历单元格版本)
如果坚持要遍历单元格,只需遍历A列的单元格(确保每行只检查一次),修正定位逻辑:
Sub RunReport() Dim srcSheet As Worksheet Dim rptSheet As Worksheet Dim i As Range Dim srcSheets As Variant Set rptSheet = ThisWorkbook.Sheets("Report") Set srcSheets = Worksheets(Array("SheetA", "SheetB", "SheetC", "SheetD")) For Each srcSheet In srcSheets For Each i In srcSheet.Range("A5:A358") With srcSheet If .Cells(i.Row, "B").Value <> "" And .Cells(i.Row, "O").Value = "" Then .Rows(i.Row).Copy Destination:=rptSheet.Cells(rptSheet.Rows.Count, "A").End(xlUp).Offset(1, 0) End If End With Next i Next srcSheet End Sub
内容的提问来源于stack exchange,提问作者Coding1
相关产品推荐
相关产品推荐

