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
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
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")