Excel Forum - Porady, Pomoc,  Excel Help, Excel FAQ Strona Główna
 FAQ  RegulaminRegulamin  Szukaj   Użytkownicy   Grupy   Rejestracja   Profil   Twoje wiadomości   Zaloguj 


Poprzedni temat «» Następny temat
ID tematu: 70586 Skopiuj do schowka Uzupełnienie/poprawienie kodu UDF
Autor Wiadomość
Staszek1406
[Usunięty]

Wysłany: 06-04-2021, 18:21   Uzupełnienie/poprawienie kodu UDF

Witam,
na jednym z blogów znalazłem taki kod:
Kod:
Function NoweWyszukajPionwo(szukana_wart As Range, Szuk_zakres As Range, kolumna As Range, Optional Format_danych As Byte = 0)
'
Dim pozycja As Range
Set pozycja = Szuk_zakres.Find(What:=szukana_wart, MatchCase:=True)

Select Case Format_danych
 Case 0
   NoweWyszukajPionwo = Cells(pozycja.Row, kolumna.Column).Value
 Case 1
   NoweWyszukajPionwo = Int(Cells(pozycja.Row, kolumna.Column).Value)
 Case 2
   NoweWyszukajPionwo = Format(CSng(Cells(pozycja.Row, kolumna.Column).Value), "Fixed")
 Case 3
   NoweWyszukajPionwo = CStr(Cells(pozycja.Row, kolumna.Column).Value)
 Case 4
   NoweWyszukajPionwo = Format(CDate(Cells(pozycja.Row, kolumna.Column).Value), "dd.mm.yyyy")
 End Select
End Function

Autor na tym przykładzie przedstawił tworzenie funkcji użytkownika.
Ten kod powstał poprzez przepisanie z bloga.
Niestety funkcja nie działa. Wyświetla błąd #ARG!.
Autor nie zamieścił listingu tej funkcji. Napisałem do autora, ale nie otrzymałem odpowiedzi.

Proszę o pomoc

Pozdrawiam

PS
Do którego z moderatorów można napisać na PW (dotyczy konta na forum) ?
  
ID posta: 403251 Skopiuj do schowka
 
 
Rafał B.
Stały bywalec Excelforum



Wersja: Win Office 2016
Pomógł: 40 razy
Posty: 283
Wysłany: 06-04-2021, 19:11   

Ta funkcja przyjmuje Range jako argumenty (nie licząc tego ostatniego). Przecież masz wszystko opisane w pierwszym wierszu, który przytoczyłeś.

Wywołujesz więc:
Kod:
=NoweWyszukajPionwo(A1;E4:G20;F2)


A1 - komórka z szukaną wartością
E4:G20 - dane, zakres (czyli tabela_tablica jak w wyszukaj.pionowo)
F2 - dowolna komórka wskazująca na kolumnę- w naszym przykładzie "F", czyli będzie szukać w drugiej kolumnie w tym zakresie wyżej zdefiniowanym. Może być też F1, F999, nie ma to znaczenia, tylko chodzi o kolumnę
_________________
Jest niemal niemożliwe nauczenie dobrego programowania uczniów, którzy byli narażeni na kontakt z BASIC: jako potencjalni programiści są okaleczeni, bez nadziei na poprawę. (Edsger Dijkstra, pionier informatyki).
Po części dotyczy również VBA.
  
ID posta: 403254 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 2118 razy
Posty: 6628
Wysłany: 06-04-2021, 19:21   

Ta funkcja w zasadzie działa, ale trochę nietypowo, jest napisana pod czyjeś konkretne potrzeby.
Wprowadziłem drobne poprawki: usunąłem literówkę w nazwie funkcji,
usunąłem z deklaracji wymóg, żeby pierwszy argument był odwołaniem (adresem). W tej chwili może być zarówno odwołaniem jak i wartością.
Poza tym ostrożnie należy używać ostatniego argumentu. Na ogół wymagane jest by wartość zwracana była liczbą.

Szkoda, że nie pokazałeś własnego przykładu jak chciałeś tej funkcji używać.

Nie wiem, jaka była intencja piszącego kod tej funkcji. Jeśli myślał o jej użyciu w sposób pokazany przez Rafała, czyli z użyciem wielokolumnowego zakresu jako drugiego argumentu, to będzie się ona zachowywać inaczej niż znana nam funkcja WYSZUKAJ.PIONOWO, bo będzie szukać wartości z pierwszego argumentu gdziekolwiek w obszarze drugiego argumentu, a nie tylko w pierwszej kolumnie.
Wynik zostanie zaś zwrócony z pierwszej kolumny zakresu podanego w trzecim argumencie, z wiersza tego, w którym znaleziono wartość szukaną.

W sumie jest tu dużo możliwych wariantów użycia, niektóre nie są oczywiste. Trzeba dokładnie przeanalizować kod.

Nowe_Wyszuk_Pion.xlsm
Pobierz Plik ściągnięto 7 raz(y) 14.73 KB

  
ID posta: 403256 Skopiuj do schowka
 
 
Staszek1406
[Usunięty]

Wysłany: 07-04-2021, 16:25   

Witam,
Maciej Gonet napisał"
Cytat:
Ta funkcja w zasadzie działa, ale trochę nietypowo, jest napisana pod czyjeś konkretne potrzeby.


Post, z którego zaczerpnąłem kod funkcji NoweWyszukajPionowo był zatytułowany Jak stworzyć własną funkcję w Excelu? Tyle wyjaśnienia.

W załączniku przedstawiłem działanie tej funkcji i problemy, na jakie natrafiłem.
Funkcja działa prawidłowo, gdy w kol D są stałe. Natomiast, gdy w tej kolumnie są wyniki działania formuły wyświetla #ARG! (nieprawidłowy typ danych użytej w formule). Sprawdzałem funkcją CZY.TEKST wartości z kolumn D i Z, w obu przypadkach wynik PRAWDA. Próbowałem wynik formuły przekonwertować na tekst funkcją T. Niestety bez rezultatu. Jak spowodować, aby funkcja działała także, gdy wartości są wynikiem działania formuły?

Pozdrawiam

Pionowo.xlsm
Pobierz Plik ściągnięto 9 raz(y) 23.44 KB

ID posta: 403282 Skopiuj do schowka
 
 
Tajan


Pomógł: 4767 razy
Posty: 10469
Wysłany: 07-04-2021, 19:08   

Zmień linię:
Kod:
Set pozycja = Szuk_zakres.Find(What:=szukana_wart, MatchCase:=True)

w taki sposób:
Kod:
Set pozycja = Szuk_zakres.Find(What:=szukana_wart, MatchCase:=True, LookIn:=xlValues, LookAt:=xlWhole)

a po tej linii dodaj jeszcze:
Kod:
If pozycja Is Nothing Then
   NoweWyszukajPionowo = CVErr(xlErrNA)
   Exit Function
End If
aby funkcja zwracała prawidłowy kod błędu w przypadku nieodnalezienia wartości.
Chciałbym jeszcze zwrócić uwagę, że funkcja nie zawsze wyszuka pierwszą wartość. Zwróć uwagę na wynik wyszukania wartości "ES". Aby tego uniknąć konieczna jest dalsza rozbudowa funkcji. Ale nie wiem, czy jest to ci potrzebne.
Ostatnio zmieniony przez Tajan 07-04-2021, 19:17, w całości zmieniany 1 raz  
ID posta: 403288 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 2118 razy
Posty: 6628
Wysłany: 07-04-2021, 19:11   

Trzeba było zacząć od przykładu jak chcesz tej funkcji używać, bo ona bazuje na metodzie Range.Find, która działa w określony sposób i ma wiele parametrów, które mogą modyfikować sposób jej działania. Te parametry (poza jednym) nie zostały określone, więc przyjęto ich wartości domyślne. A w przypadku tej funkcji wartości domyślne mogą wynikać z poprzedniego użycia tej funkcji (funkcja pamięta ostatnio używane wartości niektórych parametrów), więc to jeszcze komplikuje sytuację.
Dlatego pisałem, że trzeba dokładnie przeanalizować kod w kontekście potrzeby jego użycia.
Jeżeli funkcja miała być tylko przykładem to jest, bo w określonych sytuacjach działa.
Natomiast to nie oznacza, że w tej formie będzie działać w każdej sytuacji.
Dlatego w zależności od tego jak chcemy jej używać musimy zmodyfikować wartości parametrów, które wpływają na jej działanie. Pierwszą rzeczą, jaką powinieneś był zrobić, to przeczytać opis działania metody Find i znaczenie jej parametrów.
Pierwszą ważną rzeczą jest w czym funkcja ma szukać poszukiwanej wartości. Może jej szukać w wartościach lub w formułach w obszarze przeszukiwanym. Domyślnie szuka w formułach. Jeśli obszar przeszukiwany zawiera stałe, to nie ma to znaczenia, natomiast gdy zawiera formuły, a Ty chcesz szukać w wartościach, to trzeba dodać argument
Kod:
LookIn:=xlValues

Druga kwestia wiąże się z dopasowaniem. Czy wartość szukana ma pasować dokładnie do wartości w obszarze przeszukiwanym, czy wystarczy, żeby była w nim zawarta?
Określa to parametr LookAt, który może przyjmować wartość xlWhole albo xlPart. On nie jest tu określony, co oznacza, że przyjęte będzie xlPart, zatem wystarczy jak wartość szukana mieści się w wartości znalezionej.
W Twoim przypadku oznacza to, że mógłbyś szukać również w kolumnie X, niekoniecznie Z. A jeśli zależy Ci na dopasowaniu dokładnym, trzeba dodatkowo zdefiniować ten parametr. Nota bene wyszukiwanie dokładne/przybliżone znaczy co innego w przypadku funkcji Excela WYSZUKAJ.PIONOWO, a co innego w metodzie Find.
Trzeci aspekt wiąże się z duplikatami, które występują w Twoich danych. Z przykładu rozumiem, że oczekujesz, że funkcja znajdzie pierwsze dopasowanie. Żeby tak było potrzebny jest jeszcze jeden parametr After. Metoda Find domyślnie zaczyna szukać od drugiej komórki przeszukiwanego zakresu. Jeśli więc dopasowanie jest już w pierwszej komórce, a występuje inne dopasowanie (duplikat), to to pierwsze zostanie pominięte (w pierwszym obiegu funkcji Find). Jeśli taka sytuacja może wystąpić trzeba wskazać, że poszukiwanie ma się zacząć za ostatnią komórką zakresu.
Kod:
After:=Szuk_zakres(Szuk_zakres.Count)

Jest jeszcze więcej parametrów opcjonalnych, które mogą modyfikować działanie metody Find, więc nie należy stosować jej bezmyślnie.
Ale tych wszystkich aspektów nie poruszyłeś w swoim pierwszym poście, więc trudno się było domyślić, jak chcesz używać tej funkcji.
Sprawdź czy teraz jest jak chciałeś, może jeszcze trzeba coś doprecyzować.

Pionowo1.xlsm
Pobierz Plik ściągnięto 5 raz(y) 20.6 KB

  
ID posta: 403289 Skopiuj do schowka
 
 
Staszek1406
[Usunięty]

Wysłany: 07-04-2021, 20:55   

Witam,
dziękuję wszystkim za rady, wskazówki i za znalezienie czasu na rozwiązanie problemu.
Przepraszam, że nie zamieściłem załącznika przy poście inicjującym temat. Wydawało mi się, że problem leży w braku jakieś linijki kodu.
Przeczytałem jeszcze raz post, z którego pobrałem kod funkcji. O metodzie FIND autor pisze bardzo niewiele. Dziękuję Maciejowi za wyjaśnienia dotyczące metody FIND.

Pozdrawiam

Stanisław
ID posta: 403291 Skopiuj do schowka
 
 
ąćęłńóś
Excel Expert


Pomógł: 327 razy
Posty: 1615
Wysłany: 08-04-2021, 18:39   

Należy jeszcze pamiętać o pewnych niuansach/"właściwościach" 'Find' w przypadku wyszukiwania w zakresach, w których są ukryte wiersze/kolumny - w takim przypadku z wyszukiwaniem poradzi sobie tylko 'Find' z parametrem "LookIn:=xlFormulas", "xlValues" zawodzi - tak więc w sumie, to należałoby zastosować wyszukiwanie zarówno z "xlFormulas", jak i z "xlValues", aby być "pewnym", że coś "może" znajdziemy.
ID posta: 403305 Skopiuj do schowka
 
 
Staszek1406
[Usunięty]

Wysłany: 08-04-2021, 19:35   

Witam,
dzięki za dodatkowe uwagi o metodzie Find.

Pozdrawiam
Stanisław
ID posta: 403312 Skopiuj do schowka
 
 
Wyświetl posty z ostatnich:   
Odpowiedz do tematu
Nie możesz pisać nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Nie możesz załączać plików na tym forum
Możesz ściągać załączniki na tym forum
Dodaj temat do Ulubionych
Wersja do druku

Skocz do:  

Powered by phpBB modified by Przemo © 2003 phpBB Group
Theme xandgreen created by spleen& Programosy modified v0.3 by warna
Opieka techniczna www.marketingNET.pl

Archiwum

Strona używa plików cookies.

Kliknij tutaj, żeby dowiedzieć się jaki jest cel używania cookies oraz jak zmienić ustawienia cookie w przeglądarce.
Korzystając ze strony użytkownik wyraża zgodę na używanie plików cookies, zgodnie z bieżącymi ustawieniami przeglądarki.
Sprawdź, w jaki sposób przetwarzamy dane osobowe