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: 60986 Skopiuj do schowka Funkcja UDF do odczytu właściwości komórek
Autor Wiadomość
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1273 razy
Posty: 4362
Wysłany: 31-03-2018, 14:19   Funkcja UDF do odczytu właściwości komórek

Napisałem funkcję UDF, która pozwala z poziomu arkusza odczytywać właściwości obiektów zakresów (Range). Wykorzystuje funkcję VBA CallByName, wywoływaną w pętli, bo potrafi ona obsłużyć naraz tylko jeden poziom właściwości, a w praktyce zwykle mamy łańcuch takich właściwości.
Myślę, że może to być przydatne narzędzie, bo przeskakiwanie miedzy arkuszem a oknem Immediate nie zawsze jest wygodne.
Funkcja pobiera 2 argumenty: pierwszym jest zakres (odwołanie, nazwa lub tekst adresu), drugim tekst zawierający łańcuch właściwości oddzielonych standardowo kropkami.
Funkcja ma pewne ograniczenia w użyciu. Są one wymienione w przykładowym arkuszu, ale i tak wydaje mi się, że w większości zastosowań sprawdza się zadowalająco.
Życzę wszystkim Forowiczom (albo Forumowiczom, jak chcą niektórzy) zdrowych i radosnych Świąt Wielkanocnych.

Właściwości_Range.xlsm
Pobierz Plik ściągnięto 90 raz(y) 19.24 KB

ID posta: 343586 Skopiuj do schowka
 
 
negatyv
Excel Expert



Zaproszone osoby: 393
Pomógł: 338 razy
Posty: 1720
Wysłany: 18-04-2018, 20:41   

Do czego to w praktyce używałeś?
_________________
http://www.123office.pl - blog poświęcony programom pakietu MS Office.

Kurs VBA | LinkedIn
ID posta: 344685 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1273 razy
Posty: 4362
Wysłany: 20-04-2018, 09:33   

Dobre pytanie, równie proste, jak trudno na nie wprost odpowiedzieć. To tak jakby zapytać "do czego używasz funkcji UDF?". Nie mam jakiegoś jednego wyróżnionego zastosowania, używam wtedy gdy z jakichś względów nie chcę pisać dedykowanych funkcji UDF, a potrzebuję sprawdzić w arkuszu, jakie właściwości mają komórki. Może to mieć też aspekt dydaktyczny, bo wyraźnie widać składnię właściwości. Natomiast gdy walczymy z milisekundami o efektywność, to na pewno lepiej się sprawdzą rozwiązania bezpośrednie.
Ja też napisałem to stosunkowo niedawno, więc jeszcze tak dużo okazji użycia nie miałem. Kilka przykładów, wydawało mi się, że dość różnorodnych podałem poprzednio w pliku. Teraz jeszcze jeden, pokazujący ideę odczytu wartości z komórek scalonych za pomocą właściwości MergeArea - taki problem dość często przewija się na Forum.

Właściwości_Range2.xlsm
Pobierz Plik ściągnięto 75 raz(y) 18.53 KB

ID posta: 344796 Skopiuj do schowka
 
 
negatyv
Excel Expert



Zaproszone osoby: 393
Pomógł: 338 razy
Posty: 1720
Wysłany: 20-04-2018, 11:32   

Ok, czytaniem scalonych komórek mnie kupiłeś. Ostatecznie jednak należy to traktować jako ostateczność do niwelowania skutków różnych złych praktyk. Mam na myśli przede wszystkim nadawanie formatowaniu wartości merytorycznej.

Jeżeli dobrze pamiętam to jeżeli w arkuszu użyjemy chociaż jednej funkcji volatile to całe drzewo przeliczania idzie do kosza i każda jedna formuła jest przeliczana przy każdej edycji. Czy w przypadku UDF jest inaczej?
_________________
http://www.123office.pl - blog poświęcony programom pakietu MS Office.

Kurs VBA | LinkedIn
ID posta: 344815 Skopiuj do schowka
 
 
Maciej Gonet 
Excel Expert


Wersja: Win Office 2016
Pomógł: 1273 razy
Posty: 4362
Wysłany: 20-04-2018, 11:44   

Nie wiem, jaki jest dokładnie mechanizm przeliczania. Kiedyś próbowałem to śledzić, ale stwierdziłem, że czasem przeliczanie odbywa się jakby "bez powodu", przy bezczynności arkusza. Ale ogólnie funkcje UDF napisane jako Volatile przeliczają się przy każdym przeliczaniu arkusza, a te bez Volatile przeliczają się przy zmianie argumentów. Od wersji bodaj 2003 funkcje UDF Volatile nie przeliczają się wielokrotnie w obliczeniach iteracyjnych, co utrudnia ich programowanie (ale może przyspiesza inne obliczenia).
ID posta: 344818 Skopiuj do schowka
 
 
negatyv
Excel Expert



Zaproszone osoby: 393
Pomógł: 338 razy
Posty: 1720
Wysłany: 20-04-2018, 11:55   

Sam pracowałem nad arkuszem, który przeliczał się kilkanaście minut przy każdej zmianie komórki. Ostatecznie znalazłem jedno użycie funkcji dziś(). Usunąłem to wywołanie i wypełniałem komórkę aktualną datą przy otwieraniu. Arkusz zaczął się przeliczać w ułamku sekundy.

Ostatecznie nie bagatelizowałbym "inteligencji" excela i jego drzewa obliczeń :)
_________________
http://www.123office.pl - blog poświęcony programom pakietu MS Office.

Kurs VBA | LinkedIn
ID posta: 344819 Skopiuj do schowka
 
 
szuszana 
ExcelSpec


Pomogła: 169 razy
Posty: 593
Wysłany: 20-04-2018, 20:24   

Cytat:
Ostatecznie znalazłem jedno użycie funkcji dziś()...

Volatile Excel Functions
ID posta: 344874 Skopiuj do schowka
 
 
negatyv
Excel Expert



Zaproszone osoby: 393
Pomógł: 338 razy
Posty: 1720
Wysłany: 20-04-2018, 20:51   

Na stronie Microsoftu można znaleźć wyczerpujące opracowanie na ten temat:

https://msdn.microsoft.com/en-us/library/office/bb687891.aspx?f=255&MSPPError=-2147217396
_________________
http://www.123office.pl - blog poświęcony programom pakietu MS Office.

Kurs VBA | LinkedIn
ID posta: 344875 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