根据UsedRange.Rows进行过滤时,将代码调整为不出错

问题描述 投票:0回答:1

我有一段代码可以根据两个不同的范围过滤工作表(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)但是这导致代码完全忽略过滤的行,并将每行数据复制到新的工作表。

我不确定我是否缺少一些简单的东西或更复杂的东西。任何帮助表示赞赏。

excel vba excel-vba
1个回答
1
投票

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的事实不应该是一个问题,因为看起来你有一个持久的标题行。

© www.soinside.com 2019 - 2024. All rights reserved.