2012-06-01 7 views
30

Jeśli mam filtr automatyczny skonfigurowany w programie Excel i chcę przechodzić przez wszystkie widoczne dane w jednej kolumnie z kodem VBA, jaki jest najłatwiejszy sposób to zrobić?Najprostszym sposobem na przeglądanie przefiltrowanej listy za pomocą VBA?

Wszystkie ukryte wiersze, które zostały odfiltrowane, nie powinny być dołączane, więc czysty zakres od góry do dołu nie pomaga.

Jakieś dobre pomysły? Dzięki.

Odpowiedz

45

Załóżmy, że mam numery od 1 do 10 w komórkach A2:A11 z moim autofiltrem w A1. Teraz filtruję, aby pokazywać tylko liczby większe niż 5 (tj. 6, 7, 8, 9, 10).

Ten kod będzie drukować tylko widoczne komórki:

Sub SpecialLoop() 
    Dim cl As Range, rng As Range 

    Set rng = Range("A2:A11") 

    For Each cl In rng 
     If cl.EntireRow.Hidden = False Then //Use Hidden property to check if filtered or not 
      Debug.Print cl 
     End If 
    Next 

End Sub 

Być może istnieje lepszy sposób z SpecialCells ale przede pracował dla mnie w programie Excel 2003.

EDIT

Wystarczy znaleźć lepszy sposób z SpecialCells:

Sub SpecialLoop() 
    Dim cl As Range, rng As Range 

    Set rng = Range("A2:A11") 

    For Each cl In rng.SpecialCells(xlCellTypeVisible) 
     Debug.Print cl 
    Next cl 

End Sub 
+0

Dzięki za wszystkie odpowiedzi! Wszystkie były mniej więcej takie same (użycie SpecialCells (xlCellTypeVisible) było kluczem, którego potrzebowałem), więc trudno jest wybrać właściwą odpowiedź. – mattboy

8

Jednym ze sposobów przyjmowania przefiltrowanych danych w A1 w dół;

dim Rng as Range 
set Rng = Range("A2", Range("A2").End(xlDown)).Cells.SpecialCells(xlCellTypeVisible) 
... 
for each cell in Rng 
    ...  
11

polecam korzystania Offset zakładając, że nagłówki są w wierszu 1. Zobacz przykład

Option Explicit 

Sub Sample() 
    Dim rRange As Range, filRange As Range, Rng as Range 
    'Remove any filters 
    ActiveSheet.AutoFilterMode = False 

    '~~> Set your range 
    Set rRange = Sheets("Sheet1").Range("A1:E10") 

    With rRange 
     '~~> Set your criteria and filter 
     .AutoFilter Field:=1, Criteria1:="=1" 

     '~~> Filter, offset(to exclude headers) 
     Set filRange = .Offset(1, 0).SpecialCells(xlCellTypeVisible).EntireRow 

     Debug.Print filRange.Address 

     For Each Rng In filRange 
      '~~> Your Code 
     Next 
    End With 

    'Remove any filters 
    ActiveSheet.AutoFilterMode = False 
End Sub 
+0

To jest miły sposób na rozwiązanie problemu. Podoba mi się twoje podejście. –

+1

Dobre rozwiązanie Sid. Byłbym jednak bardzo ostrożny podczas używania 'SpecialCells'. Ostatnio napotkałem problem z powodu sposobu, w jaki program Excel wysyła ".Address" tych komórek (w oparciu o ich ciągłe występy). –

+0

@PankajJaju: Przykro mi, że cię nie dostałem. Czy mógłbyś wyjaśnić, co masz na myśli? może z przykładem? –

-1
Call MyMacro() 

ActiveCell.Offset(1, 0).Activate 

Do Until Selection.EntireRow.Hidden = False 
If Selection.EntireRow.Hidden = True Then 
ActiveCell.Offset(1, 0).Activate 
End If 
Loop 
+1

Byłoby pomocne, jeśli podasz wyjaśnienie, co robi kod. –

Powiązane problemy