我有一段代码可以根据两个不同的范围过滤工作表(snowCsatDetails)。过滤后,工作表在标题后可以有0行,或者1到多行。一旦过滤,第二段代码将计入最后一行,然后将这些行(如果存在的话)复制到新工作表(snowCsatSummary)。
snowCsatDetails.Range("A1:F" & LastRow).AutoFilter Field:=5, _
Criteria1:="=1", Operator:=xlOr, Criteria2:="=2"
snowCsatDetails.Range("A1:F" & LastRow).AutoFilter Field:=2, _
Criteria1:=Array(var1, var2, var3, var4, var5, var6, var7), Operator:=xlFilterValues
filteredLastRow = ActiveSheet.UsedRange.Rows.Count
filledRows = ActiveSheet.Range("A2:A" & filteredLastRow).SpecialCells(xlCellTypeVisible).Count
snowCsatSummary.Activate
snowCsatDetails.Range("A2:A" & filteredLastRow).Copy
Range("A13").PasteSpecial
snowCsatDetails.Range("B2:B" & filteredLastRow).Copy
Range("B13").PasteSpecial
snowCsatDetails.Range("C2:C" & filteredLastRow).Copy
Range("D13").PasteSpecial
snowCsatDetails.Range("E2:E" & filteredLastRow).Copy
Range("F13").PasteSpecial
snowCsatDetails.Range("F2:F" & filteredLastRow).Copy
Range("G13").PasteSpecial
到目前为止,代码工作正常,因为在过滤第一个工作表后数据一直存在。但是,今天,当过滤时,不存在任何行。现在代码在“filledRows”行上出错了。看来这是因为没有什么可复制的。
所以,我尝试将错误处理添加到这一行(它上面的On Error Resume Next
和它下面的On Error GoTo 0
)但是这导致代码完全忽略过滤的行,并将每行数据复制到新的工作表。
我不确定我是否缺少一些简单的东西或更复杂的东西。任何帮助表示赞赏。
UsedRange
被认为是不可靠的,使用Find
是优选的。例如,请参阅this topic。
如果你有一个简单的设置,并且知道UsedRange
的潜在问题,并希望继续你当前的代码,那么你可以检查UsedRange.Rows.Count
是否大于1.它将至少为1,即使工作表没有内容。
filteredLastRow = ActiveSheet.UsedRange.Rows.Count
If filteredLastRow > 1 Then
' there is some data to process..
End If
这个数字不会是0的事实不应该是一个问题,因为看起来你有一个持久的标题行。