我相信您的代码在第一行数据之后停止的原因是因为您在下一行中测试的单元格是空的(在您的示例电子表格中),因此您退出循环(因为Len(cell.Value) = 0
)。我建议采用不同的方法:高级过滤器完全满足您的需求,而且速度更快。在您的示例电子表格中,您需要插入一个空行 2 并将公式“=10”放在单元格 A2 中。然后下面的代码将做你需要的(假设master
是 ActiveSheet):
Sub CopyData()
Dim rngData As Range, lastRow As Long, rngCriteria As Range
With ActiveSheet
' This finds the last used row of column A
lastRow = .Cells(.Rows.Count, "A").End(xlUp).Row
' Defines the criteria range - you can amend it with more criteria,
' it will still work
' 22 is the number of the last column in your example spreadsheet
Set rngCriteria = .Range(.Cells(1, 1), .Cells(2, 22))
' row 2 has the filter criteria, but we will delete it after copying
Set rngData = .Range(.Cells(1, 1), .Cells(lastRow, 22))
' Make sure the destination sheet is clear
' You can replace sheet2 with Sheets("top10"),
' but if you change the sheet name your code will not work any more.
' Using the vba sheet name is usually more stable
Sheet2.UsedRange.ClearContents
' Here we select the rows we need based on the filter
' and copy it to the other sheet
Call rngData.AdvancedFilter(xlFilterCopy, rngCriteria, Sheet2.Cells(1, 1))
' Again, replacing Sheet2 with Sheets("top10")..
' Row 2 holds the filter criteria so must be deleted
Sheet2.Rows(2).Delete
End With
End Sub
有关高级过滤器的参考,请查看此链接:
http ://chandoo.org/wp/2012/11/27/extract-subset-of-data/