Filtr Zaawansowany i VBA   strona główna:
A po co ten Excel ;-)
 
Filtr Zaawansowany to wg mnie jedno z najfajniejszych narzędzi w Excelu służące do wyciągania z bazy danych spełniających określone  
warunki. Czort jednak wie czemu narzędzie to ma zasadnicze ograniczenie. Mianowicie: zarówno dane oraz wyniki filtrowania muszą być  
w jednym Arkuszu :-?? No a przecież najwygodniej by było żeby np.: dane były w jednym Arkuszu a warunki i wyniki w innym  
No ale nie ma tak dobrze ;-) Excel krzyczy:  
"Przefiltrowane dane mogą zostać tylko skopiowane do aktywnego arkusza"  
i nie przeskoczy tego ani tworzeniem zdefiniowanego nazwą zakresu ani żadnym znanym mi sposobem... z wyjątkiem VBA :-D  
Tu dowolność nie ma żadnych ograniczeń.  
 
    Jak więc powinna wyglądać przykładowa procedura wykorzystująca Filtr Zaawansowany która obejdzie ograniczenia Excela?  
 
Sub AdvancedFilter_VBA()  
    Dim wksNry As Excel.Worksheet, rngCrit As Excel.Range  
    Dim wksDane As Excel.Worksheet, rngDane As Excel.Range  
    Dim wksWynik As Excel.Worksheet  
      
    With ThisWorkbook  
        Set wksNry = .Worksheets("Warunki")  
        Set wksDane = .Worksheets("Dane")  
        Set wksWynik = .Worksheets("Wynik")  
    End With  
      
    Set rngCrit = wksNry.Range("A1:A15")  
    Set rngDane = wksDane.Range("A1:F150")  
         
    rngDane.AdvancedFilter Action:=xlFilterCopy, _  
                           CriteriaRange:=rngCrit, _  
                           CopyToRange:=wksWynik.[A1], _  
                           Unique:=False  
 
    Set rngCrit = Nothing  
    Set rngDane = Nothing  
    Set wksNry = Nothing  
    Set wksDane = Nothing  
    Set wksWynik = Nothing  
End Sub  
 
Mamy więc trzy Arkusze: Dane, Warunki, Wyniki. Zakres rngDane to zakres A1:F150 w Ark.Dane, zakres rngCrit to zakres A1:A15 w  
Ark.Warunki. Wyniki są zwracane od kom.A1 Ark.Wyniki. Analiza powyższej procedury powinna uzmysłowić prostotę rozwiązania jednak  
w praktyce może być trochu gorzej.  
   - dane nie muszą kończyć się w 150 wierszu Ark.Dane  
   - warunki nie muszą zawierać się z zakresie A1:A15, nie muszą dotyczyć tylko jednej kolumny  
   - trzeba by czyścić zakres docelowy przed zwróceniem do niego nowych danych  
Jednak to trochu zniekształci nam to co chciałbym przekazać: metoda jest prosta, a rozwiązanie niedoceniane przez fakt, że ręcznie  
Excel nam na to nie pozwoli. Jednak jeżeli określenie ostatniego wypełnionego wiersza w zakresie nie jest dla nas problemem to należy  
traktować tę metodę jako najefektywniejszą. Zachęcam do testów i stosowania :-)  
    Przykład można pobrać i przetestować z excelforum.pl (link z prawej)   link do przykładu