Podanie wartości z wyfiltrowanego zakresu danych
W jaki sposób można uzyskać informację, jaka wartość została wybrana z wyfiltrowanego zakresu dnaych? Na przykład: mamy 200 wierszy, z których każdy zawiera ncyfrę narastającą względem poprzedniej - 1,2,3,itp. Wyfiltruję np. 25. Jaka funkcja umozliwi mi wyświetlenie w wyznaczonej przez mnie komórce, jaka wartość została wybrana? Problemem jest to, że w zalezności od tego jaką wybiorę cyfrę, inna będzie jej pozycja w zbiorze.
Jest to potrzebne, aby powiązać wybrana wartość z funkcja wyszukiwania pionowego - nie wiem jednak, jaką wynkcją wymusić na EXCEL-u, aby podawał wybraną w drodze filtrowania wartość.
HEELP!!!
Odpowiedzi: 1
Witaj.
Jak dla mnie, to filtrowanie jest niepotrzebnym utrudnieniem! Formuła wyszukująca wręcz go nie potrzebuje. Aby wybierać wartości z listy można użyć 'pola kombi' ( ze sprawdzania poprawności, z paska 'formularze' lub z 'przybornika formantów'). WYSZUKAJ.PIONOWO pozwala użyć tylko jednego kryterium ale są inne sposoby (formuły tablicowe) by kryteriów było więcej.
Opisz swój problem, czego wyszukujesz i w czym, to pomożemy Ci na forum wybrać optymalny wariant.
Pozdrawiam
To nie jest takie proste - ciężko to nawet wytłumaczyć :-)) <br />Muszę korzystać z filtrowania, bo nie potrafię sobie poradzić ze stworzeniem równie przydatnego narzędzia. <br /> <br />Załóżmy taką sytuację: masz 800 wierszy. Wśród nich jest 30 argumentów, obok których występują różne dane (np. 30 Miejscowości, a obok każdej z nich różne nazwisko). Zależy mi na tm, aby wyfiltrować np. miejscowość nr 3. Dodatkowo, mam napisany skrypt w VB który na podstawie zawartości np. pola A1 eksportuje zakładkę z wyfiltrowanymi danymi do odrębnego pliku. Jednakże póki co, uzytkownik musi dwukrotnie wybrać wyfiltrowaną miejscowość - raz do samego filtrowania, a drugi raz po to, aby skrypt wiedział jaką nadać nazwę plikowi. I ryzyko błędu wzrasta - bo trzeba wykonać dwie czynności, zamiast jednej (korzystają z tego "zieloni" użytkownicy...). Zalezy mi na rozwiązaniu, które będzie odczytywało z wyfiltrowanych danych wartość, która została wyfiltrowana (czyli np. 3). Problem polega na tym, że w zależności od tego którą wybierzesz wartość, zostaną wyfiltorwane różne wiersze - i skąd skrypt ma wiedzieć, o którą wartość chodzi? Przy wartości 3 będą to np. wiersze 4,8,10,22 a przy wartości 32 będą to wiersze 700, 740, 800. <br /> <br />Jak to rozwiązać?
<P>Hej.</P> <P>Zobacz takie przykladowe makra:</P> <P>Sub test1()<BR> 'podaje wartość z ostatniej komórki w kolumnie A; działa także przy autofiltrze<BR> MsgBox Range("A65536").End(xlUp).Value<BR>End Sub</P> <P>Sub test2()<BR> 'podaje wartość kryterium 1-szj kolumny autofiltra<BR> ' ActiveSheet.AutoFilter.Filters.Item(1).Criteria1<BR> <BR> With ActiveSheet.AutoFilter.Filters.Item(1)<BR> If .On Then<BR> 'pominięcie znaku '='<BR> MsgBox Mid(.Criteria1, 2)<BR> Else<BR> MsgBox "Nie wybrano kryteriów w autofiltrze dla 1-szej kolumny."<BR> End If<BR> End With<BR>End Sub</P> <P>Napisz, jeśli to nie wystarczy.</P>
Tulkas77 <br />Przepraszam, że może zbyt łopatologicznie. Ale odpowiadam nie tylko Tobie, bo wiele podobnych problemów zgłoszonych na tym forum czytałem. <br />Wyrzuć w diabły skrypt w VB, o którym wspomniałeś. Zapomnij o filtrach (Autofiltrze i Filtrze zaawansowanym) wbudowanych w Interface użytkownika Excela. Są dobre ale tylko dla lubiących filtrować na piechotę. <br />Wyznacz parę wolnych kolumn w arkuszu, w którym są dane, na formuły, które przy pomocy wbudowanych w Excelu funkcji oznaczą każdy z 800 wierszy wartością PRAWDA lub FAŁSZ wg Twoich kryteriów i podadzą numery tych wierszy. W wierszu pierwszym pierwszej wolnej kolumny np. AX wpisz formułę składającą się z kilku potrzebnych funkcji. Nie wiem dlaczego modnej funkcji WYSZUKAJ.PIONOWO nie polecam. Nigdy jej nie stosuję. Polecam za to ZNAJDŹ, SZUKAJ.TEKST, FRAGMENT.TEKSTU, JEŻELI, LUB, ORAZ, & (zamiast ZŁĄCZ.TEKSTY), INDEKS, PODAJ.POZYCJĘ, ADR.POŚR, WYBIERZ itd. Formuła będąca kombinacją tych i innych funkcji będzie może skomplikowana, ale powinna być niezmienna. Bo wartości kryteriów dla niej określisz w wybranych stałych komórkach. I te wartości mogą się oczywiście zmieniać. Jeśli sprawdzisz, że formuła jest prawidłowa na kilku wierszach, to skopiujesz ją hurtem do wszystkich pozostałych 800 komórek w tej kolumnie. Formuły powinny oznaczać każdy wiersz PRAWDA, gdy dane w wierszu spełniają kryteria, lub FAŁSZ, gdy nie spełniają. I teraz jeśli znasz trochę VBA, to stworzenie kodem pliku, do którego wpisujesz tylko wiersze oznaczone PRAWDA nie będzie problemem. A jeśli znasz słabo, to: <br />(zakładam, że formuły wpisałeś w kolumnie AX) <br />- w kolumnie AY wpisz w wierszu pierwszym: =PODAJ.POZYCJĘ(PRAWDA;AX1:AX800;0), a w drugim: <br />=PODAJ.POZYCJĘ(PRAWDA;ADR.POŚR("AX"&AY1+1&":AX$800");0)+AY1 <br />i tę drugą formułę skopiuj do pozostałych wierszy w kolumnie. Kolumna AY zwróci po kolei numery wierszy spełniające kryteria. Ale pod koniec listy numerów będzie zwracać #N/D! Dlatego w kolumnie kolejnej AZ można dać w pierwszym wierszu: <br />=JEŻELI(CZY.BŁĄD(AY1);"";AY1) i skopiować tę formułę do pozostałych wierszy kolumny AZ. Teraz tylko trzeba zliczyć liczbę wierszy większych od zera np. w komórce BA1=LICZ.JEŻELI(AZ1:AZ800;">0") i posługując się funkcją INDEKS można w drugim arkuszu pliku ściągnąć dane tych wierszy, a z niego prostym makrem (tworzenie pliku pomijam): <br />Sub Kopiuj_Dane() <br />Dim k As Integer <br />k = Range("BA1").Value <br />Workbooks("Plik2.xls").Sheets("Arkusz1").Range("A1:AD" & k).Value = _ <br />Workbooks("Plik.xls").Sheets("Arkusz2").Range("A1:AD" & k).Value <br />End Sub <br />Reasumując - jak to wszystko powinno działać? Wpisujesz w kilku (może 30) wybranych komórkach wartości kryteriów. I klikasz przycisk, którym tworzysz plik z wyfiltrowanymi danymi. Wszystko. <br /> <br />Korzystanie z wbudowanych w Excelu funkcji niektórym entuzjastom VBA może wydać się nieeleganckie. Wg nich eleganckie jest rozwiązywanie wszystkiego wyłącznie kodem VBA. Znam dobrze VBA, ale uważam, że zawsze trzeba przyjmować rozwiązania najprostsze i najszybciej działające. A funkcje wbudowane w Excelu działają wielokrotnie szybciej od najlepszych makr. W przypadku bazy 800 rekordów to nie ma większego znaczenia, ale po co męczyć się z pisaniem kodu VBA, jeśli MS dał nam szeroki wachlarz funkcji. <br />Pozdrawiam <br /> <br />PS.Gdyby przyszło do głowy Tobie lub innym stosowanie wszystkiego powyższego do baz danych o dużej liczbie rekordów np. 40000, to konieczny byłby manewr polegający na tym, że funkcja LICZ.JEŻELI w komórce BA1 powinna być wpisywana i kasowana makrem Kopiuj_Dane, bo ta funkcja strasznie spowalniałaby proces przeliczania arkusza, jeśli zlicza wyniki wielu tysięcy formuł, które zmieniają wartości w trakcie zliczania. Dlatego na początku makra należałoby wpisać: <br />Range("BA1").FormulaLocal = "=LICZ.JEŻELI(AZ1:AZ800;">0")" <br />a na końcu tego makra: <br />Range("BA1").Value = ""
<BLOCKQUOTE><div>Korzystanie z wbudowanych w Excelu funkcji niektórym entuzjastom VBA może wydać się nieeleganckie. Wg nich eleganckie jest rozwiązywanie wszystkiego wyłącznie kodem VBA. Znam dobrze VBA, ale uważam, że zawsze trzeba przyjmować rozwiązania najprostsze i najszybciej działające. A funkcje wbudowane w Excelu działają wielokrotnie szybciej od najlepszych makr. W przypadku bazy 800 rekordów to nie ma większego znaczenia, ale po co męczyć się z pisaniem kodu VBA, jeśli MS dał nam szeroki wachlarz funkcji.</div></BLOCKQUOTE><br>Ja się zgadzam - w całej "rozciągłości" :) i przybijam "piątkę"! :)<br>Wbudowane funkcje działają o wiele szybciej od VBA, a tam, gdzie nie wystarczają stosuje się VBA.<br>To się tyczy nie tylko Excela, ale również narzędzi zaawansowanych w Accessie - tam, gdzie można - stosuję wbudowane funkcje, gdzie to za mało - VBA.<br>