Pytanie jakie otrzymałem od Małgorzaty:
„Posiadam tabelę z następującymi kolumnami: nr dokumentu, branża, typ dokumentu, adresat, data, opis pisma. Tabela ma być filtrowana wg branży i typu dokumentu. Czy dałoby się zrobić tak, żeby warunki filtrowania znajdowały się powyżej tabeli, a nie bezpośrednio w nagłówku tabeli?”
Problem (w moim odczuciu) jest głównie estetyczny, niezależnie bowiem od tego jak go rozwiążemy docelowa funkcjonalność pozostanie ta sama; przefiltrować tabelę z danymi według podanych kryteriów. Ponieważ jednak pewien jestem, że lepiej kiedy coś jest ładne niż brzydkie – zajmiemy się dzisiaj pytaniem Małgorzaty (rozwiązanie widzisz na animacji poniżej).

Najprostsza metoda przefiltrowania tabeli z danymi to filtr automatyczny. Włączając go otrzymujemy tabelkę wyglądającą mniej więcej tak:

Jest to nasz punkt wyjścia. Działa, ale …. nie podoba się. Małgorzata chce, aby tabelka i warunki filtrowania wyglądały tak:

Do rozwiązania problemu wykorzystamy filtr zaawansowany i kilkanaście linijek kodu VBA.
Jak zapewne wiesz, parametry dla filtra zaawansowanego podajemy w komórkach znajdujących się poza tabelą z danymi. W naszym przypadku wyglądałoby to mniej więcej tak:

Ponieważ komórki z kryteriami dla filtra zaawansowanego muszą mieć określony układ, którym akurat nie chcemy być ograniczeni, podlinkowałem je do komórek, w których będziemy wybierać branżę i typ dokumentu. Każda zmiana na liście rozwijanej powodować będzie oczywiście automatyczną zmianę w kryteriach filtra zaawansowanego.
Wszystko, co trzeba teraz zrobić, to automatyczne zastosowanie filtra zaawansowanego po każdej zmianie zawartości jednej z komórek z warunkami filtrowania (branża lub typ dokumentu).
Zatrzymajmy się jeszcze na chwilę przy komórkach, w których będziemy wybierali branżę i typ dokumentu. Nasze rozwijane listy z opcjami do wyboru to po prostu zastosowanie sprawdzania poprawności. Poszedłem tutaj po linii najmniejszego oporu i moje kryteria poprawności dla branży (dla typu dokumentu jest to dokładnie to samo podejście) wyglądają następująco:

Dodatkowo, dla ułatwienia sobie pracy zdefiniowałem kilka nazw:

Zakres „NaszeKryteria” podzieliłem jeszcze na dwie części:

Arkusz mamy już przygotowany. Ostatni etap to kod VBA obsługujący zdarzenie „Change”. Nie wchodząc w zbytnie szczegóły, nasz kod będzie się wykonywał za każdym razem kiedy użytkownik zmieni zawartość komórki w arkuszu.

Marcin

{ 9 comments… read them below or add one }
Linia najmniejszego oporu, a nie najmniejsza linia oporu.
>Linia najmniejszego oporu, a nie najmniejsza linia oporu
Bardzo dziękuję za wytknięcie błędu. Już poprawiony. Swoją drogą świetnie, że ktoś zwraca uwagę na takie rzeczy.
Marcin
Owa linia doczekała się nawet sporej blognotki z komentarzami
http://wo.blox.pl/2009/08/Po-najmniejszej-linii-oporu.html
Witam. A jak bym chciał to dostosować do swoich potrzeb, zmienić z A na np. 9 to w kolumnach się zmieniło, ale w opcjach wyboru przy Typ dokumentu:
jest nadal A, jak kliknę w nie to pojawia się pusto, a jak zrobić żeby to A zmienić na np. 9
@michal
Zastosowałem po prostu dla tej komórki sprawdzanie poprawnosci, a jako kryterium wybrałem „lista”. Poczytaj sobie gdzie o sprawdzaniu poprawności właśnie.
Marcin
Świetny trick Marcin, z reguły ktoś korzysta z filtra zaawansowanego po to, aby przenieść dane do osobnego arkusza/skoroszytu – tutaj filtrujemy w miejscu. Mógłbyś napisać w jakim programie utworzyłeś tą animację?
Cześć Quasi,
Animacje robiłem w Camtasia Studio. Strasznie fajny programik, ale raczej drogi. Ja miałem to szczęście, że miałem jakąś starą wersję i kupiłem sobie upgrade za 1/2 ceny (i tak wychodzi nietanio).
Marcin
nie działa w Excel 2000. Otwiera się bez filtra na dodatek nie odświeża danych zakładam więc, że makro nie działa.
Bardzo fajnie opisane – na koniec pozwoliło mi to dojść do wniosku, że można to zrobić w jednej linijce kodu
Dzięki za opis, naprawdę pomógł.