VBA selecting visible cells after filtering

后端 未结 2 1685
一整个雨季
一整个雨季 2020-12-21 23:04

The following code applies filters and selects the top 10 items in column B after some filters are applied to the table. I have been using this for many different filtered

相关标签:
2条回答
  • 2020-12-21 23:18

    Thank you to @Rory

    Specialcells
    

    Doesn't work with one cell selected. Adapted by doing the following:

    ......

    For Each rC In r
        j = j + 1
        If j = 10 Or j = r.Count Then Exit For
    Next rC
    
    If j = 1 Then
        Range(r(1), rC).Copy
    Else
        Range(r(1), rC).SpecialCells(xlCellTypeVisible).Select
    End If
    
    Worksheets("For Slides").Range("P29").PasteSpecial
    Worksheets("OLD_Master").ShowAllData
    
    End Sub
    
    0 讨论(0)
  • 2020-12-21 23:27

    Rory helpfully points out:

    If you apply Specialcells to only one cell, it actually applies to the entire used range of the sheet.

    Now we know what the problem is, we can avoid it! The line of code where you use SpecialCells:

    Set r = Range("B2", Range("B" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeVisible)
    

    Instead, set the range first, test if it only contains one cell, then proceed...

    Set r = Range("B2", Range("B" & Rows.Count).End(xlUp))
    ' Check if r is only 1 cell
    If r.Count = 1 Then
        r.Copy
    Else ' Your previous code
        Set r = r.SpecialCells(xlCellTypeVisible)
        For Each rC In r
            j = j + 1
            If j = 10 Or j = r.Count Then Exit For
        Next rC
        Range(r(1), rC).SpecialCells(xlCellTypeVisible).Copy
    End If
    

    Note, you're assuming there is even one row still visible. It might be that the .End(xlUp) selects row 1 if there is no visible data, you may want to check which row this is first too!


    Aside: You really should be fully qualifying your ranges, i.e. instead of

     Set r = Range("B2")
    

    You should use

    Set r = ThisWorkbook.Sheets("MySheet").Range("B2")
    

    This will save you some confusing errors in future. There are shortcuts you can take, for example saving repetition using With blocks or declaring sheet objects.

    ' using With blocks
    With ThisWorkbook.Sheets("MySheet")
        Set r = .Range("B2")
        Set s = .Range("B3")
        ' ...
    End With
    
    ' Using sheet objects
    Dim sh as Worksheet
    Set sh = ThisWorkbook.Sheets("MySheet")
    Set r = sh.Range("B2")
    
    0 讨论(0)
提交回复
热议问题