Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Kochani, gorąco zachęcam do śledzenia mojego nowego projektu edukacyjnego

https://bekazlamusow.blogspot.com/
Oskar Shon

Oskar Shon Dodatki do Office
www.VBATools.pl

Temat: Ciekawy blog edukacyjny

Mi nie imponuje nadużywanie wulgaryzmów. Nie zamierzam nic podobnego "śledzić", a tym bardziej polecać.


Obrazek
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

No cóż, gdyby programiści VBA wykazywali większą skłonność do edukacji, ten blog by nie powstał...Ten post został edytowany przez Autora dnia 01.10.17 o godzinie 20:40
Mariusz Jankowski

Mariusz Jankowski Programista
Excel/VBA

Temat: Ciekawy blog edukacyjny

A ja postaram się odpowiedzieć merytorycznie, wulgaryzmy wykasuję :)
Maciek G.:
Pani podstawówce mówiła na matematyce: funkcja dostaje argumenty (może ich być dowolna
ilość), ale zawsze ZWRACA JEDNĄ WARTOŚĆ.

W zdecydowanej większości przypadków tak jest, ale są sytuacje, że funkcja może zwracać tablicę wyników. Ja np. bardzo często używam funkcji VBA, która na wejściu pobiera zakres komórek, zaś w wyniku zwraca tablicę unikatowych wartości z niego.
A mam wrażenie że lameria wykorzystuje funkcje na pińcet różnych sposobów, tylko nie na ten
jeden, właściwy. Otóż mamy tak:

Może nie do końca rozumieją różnice między procedurami typu Sub i Function? Na pozór jest to bardzo proste: Sub wykonuje jakieś zmiany w pliku, wprowadza zmiany w obiektach, ale nie zwraca niczego w wyniku. Function natomiast zawsze musi zwrócić wynik tego działania. Ale to nie oznacza, że Function ma dokonywać tylko wyliczeń - można np. w treści funkcji wyświetlić okienko dialogowe do zaznaczenia pliku z dysku i w wyniku podać pełną ścieżkę do tego pliku (pusty ciąg gdy user nie wybrał pliku). Sytuacja robi się też bardziej zagmatwana gdy zaczynamy tworzyć metody dla własnych obieków (klasy). Zakłada się, że metoda to czasownik, a właściwość to rzeczownik. Ale nie do końca. Bo metodą może być procedura Sub (nie zwraca wyniku) i procedura Function (zwraca wynik). No i często tak też jest, że ludziom się wydaje, że tylko Function może posiadać argumenty, rzadziej się spotyka Suby posiadające argumenty.
funkcja która zmienia stan jakiegoś obiektu (koloruje komórki na różowo np.) i nie zwraca żadnej > referencji -> no przecież to jest sub a nie function

Tak, to typowy Sub.
funkcja która zmienia stan jakiegoś obiektu i zwraca do niego referencje -> na c***j? Przecież to
sub, j.w.

Tak. Jak widzę funkcję, która zwraca w wyniku obiekt to też mi się scyzoryk w kieszeni otwiera. Funkcje generalnie tworzy się w dwóch celach: po to aby przypisać zmienną do wyniku funkcji i po to aby wykorzystać ją w arkuszu, jak inne funkcje Excelowe. Funkcji, która zwraca w wyniku obiekt nie da się wykorzystać w arkuszu!
funkcja która tworzy jakiś obiekt (dodaje arkusz np.), ale nie zwraca do niego referencji, a zamiast > tego zwraca jakiegoś gównianego booleana który mówi o tym czy się udało utworzyć (na c**j?) a > potem referencje do niego musisz wykombinować na około (np. odwołując się do aktywnego)

To są właśnie metody utworzone przez Function. One często zwracają w wyniku Boolean. Moim zdaniem to nie jest aż takie głupie. Można przypisać zmienną Boolean do wyniku działania takiej funkcji aby sprawdzić czy udało się np. zaimportować jakieś dane z zewnątrz. Zależnie od tego czy się udało czy nie (IF) można przejść w swojej aplikacji dalej lub nie.
funkcja która wylicza jakąś wartość albo tworzy obiekt, ale zamiast normalnie zwrócić to co
stworzyła, to nic nie zwraca, albo zwraca coś z dupy, a tą wyliczoną wartość przekazuje byRef

Z takim czymś się jeszcze nie spotkałem. Może tutaj wchodzić w grę jakiś brak wizji na starcie pisania funkcji tzn. user nie wie jakie argumenty ma pobrać funkcja i co zwrócić w wyniku.
funkcja która coś niby zwraca, ale dodatkowo coś innego przekazuje byRef, czyli df. zwraca dwie
różne wartości

Moim zdaniem, jak wyżej. Pisanie kodu bez przemyślenia.
Mnie zastanawia tylko jedna rzecz - jeżeli lamusy wykorzystują "funkcje" na takie właśnie
niedorobione sposoby, to na jakiej właściwie podstawie decydują, która procedura jest subem a
która funkcją?

Może robią to na wyczucie?Ten post został edytowany przez Autora dnia 02.10.17 o godzinie 10:25
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Ad "w zdecydowanej większości przypadków"

Tablica to dalej 'jedna zmienna typu tablica', rajt? Funkcja może zwracać zmienną dowolnego typu , chociażby nawet był to obiekt zaje8iście wysokiego poziomu. Ale ma ona być JEDNA i ma być ZWRACANA, a nie przekazywana byRef, albo w ogóle bokiem (tzn. nie zwracam referencji tylko korzystam z tego, że po wykonaniu funkcji stworzony obiekt jest np. aktywny albo ma określony indeks)

Ad "może nie do końca rozumieją"

No właśnie:)

Ad "nie jest to takie głupie"

Oczywiście że jest to głupie. Jeżeli funkcja nic nie zwraca, to po co jest funkcją? Boolean mówiący "czy się udało" to jakaś aberracja. To gwałci samą istotę funkcji. Funkcja powinna mieć jeden punkt wyjścia. W takim układzie to co funkcja stworzyła wychodzi "bokiem", a w miejscu przewidzianym na wyjście jest coś innego.
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Ad "Tak. Jak widzę funkcję, która zwraca w wyniku obiekt to też mi się scyzoryk w kieszeni otwiera."

No nie. Funkcja jak najbardziej może zwracać obiekt - powiem uczciwie że ogromna większość moich funkcji tak właśnie robi - ale to jest obiekt STWORZONY PRZEZ TĄ FUNKCJĘ a nie ten co był na wejściu, albo jakiś inny , z dupyTen post został edytowany przez Autora dnia 02.10.17 o godzinie 14:42
Mariusz Jankowski

Mariusz Jankowski Programista
Excel/VBA

Temat: Ciekawy blog edukacyjny

Maciek G.:
Ad "w zdecydowanej większości przypadków"

Tablica to dalej 'jedna zmienna typu tablica', rajt? Funkcja może zwracać zmienną dowolnego typu , chociażby nawet był to obiekt zaje8iście wysokiego poziomu. Ale ma ona być JEDNA i ma być ZWRACANA, a nie przekazywana byRef, albo w ogóle bokiem (tzn. nie zwracam referencji tylko korzystam z tego, że po wykonaniu funkcji stworzony obiekt jest np. aktywny albo ma określony indeks)

Nie chcę się czepiać słówek, ale napisałeś "ZWRACA JEDNĄ WARTOŚĆ".
Trza było napisać, że zawsze zwraca określony typ wartości ;).

Ad "nie jest to takie głupie"

Oczywiście że jest to głupie. Jeżeli funkcja nic nie zwraca, to po co jest funkcją? Boolean mówiący "czy się udało" to jakaś aberracja. To gwałci samą istotę funkcji. Funkcja powinna mieć jeden punkt wyjścia. W takim układzie to co funkcja stworzyła wychodzi "bokiem", a w miejscu przewidzianym na wyjście jest coś innego.

No jest to trochę kontrowersyjne i ja też zawsze piszę najpierw Suba, a potem dopiero sprawdzam czy są warunki do uruchomienia następnej procedury. Często pisze się funkcje zwracające Boolean (czy istnieje plik, czy otwarty plik itp.), więc to mnie tak nie mierzi.

BTW. Zauważ, że jak wpiszesz w kodzie np. bSukces = Arkusz1.Delete to kompilator wyrzuci od razu błąd. Ale jak w okienku Immediate dasz ? Arkusz1.Delete to dostaniesz info True lub False mówiące o powodzeniu wykonania tej operacji.
No nie. Funkcja jak najbardziej może zwracać obiekt - powiem uczciwie że ogromna większość moich funkcji tak właśnie robi - ale to jest obiekt STWORZONY PRZEZ TĄ FUNKCJĘ a nie ten co był na wejściu, albo jakiś inny , z dupy

Zapodaj kawałek kodu. Moim zdaniem najlepiej jak funkcja zwraca ten standardowy typ wartości. Widziałem funkcje, które w wyniku zwracają np. obiekt Range odnoszący się do komórki, zamiast adres tej komórki (String).
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Funkcja zwracająca range to nieporozumienie.
Range istniał zanim "funkcja" została uruchomiona - więc "funkcja" zmieniła jego stan a nie go utworzyła - czyli technicznie jest to sub

Co innego kiedy funkcja tworzy nowy obiekt excela albo customową klasę

dim demoWorkbook as workbook
set demoWorkbook = returnDemoWorkbook

function returnDemoWorkbook as workbook
set returnDemoWorkbook = workbooks.add
end function
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Co do "jeden typ wartości" - chyba należałoby napisać - "jedną zmienną". Bo przecież "funkcja" może "zwrócić" (byref) choćby dwa stringi
Bogdan Gilarski

Bogdan Gilarski www.excelperfect.pl
Perfect And
Practical

Temat: Ciekawy blog edukacyjny

Maciek G.:
Tablica to dalej 'jedna zmienna typu tablica', rajt?
Wg mnie jednak nie rajt.
Tablica = zbiór wielu wartości, to nadal jednak zbiór, nawet jeżeli jest identyfikowany poprzez jedną nazwę (przy okazji to typ obiektu tablica a nie rodzaj zmiennej).

Function zwracające Boolean
Jeżeli w trakcie wykonania procedury sub wystąpiłby błąd, to w czym problem, żeby go obsłużyć zamieniając typ procedury z sub na function i badając zwracaną wartość tejże funkcji (Boolean)? Nie traktuję tego jako przepisu na standard programowania, ale czasami aż się o to prosi, żeby w ten sposób uprościć projekt i niejako hurtowo załatwić potencjalne problemy, na ogół związane z obsługą Excela. Ja często stosuję taki zabieg, jeżeli obawiam się, że nie wiem, co jeszcze może przyjść do głowy userowi i co on tam wyklika, czyli nie chcę/mogę przewidzieć wszystkich sytuacji, kiedy on coś zepsuje i program "zawędruje" w nieoczekiwanym kierunku. Jest to dla mnie taki główny bezpiecznik na wszelki wypadek.

Wulgaryzmy - wg mnie nie ma potrzeby ich stosowania, "akcenty" można wyróżniać kolorami lub w inny wizualny sposób, po co zniechęcać większość ludzi do projektu? Pomysł bloga oceniam jako fajny i przydatny ale wykonanie baaaardzo selektywne, niepotrzebnie selektywne :)
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Jeżeli się czepiamy słówek, to tablica to nie obiekt. Nawet tablica z obiektami nie jest obiektem. Ale stanowczo protestuję przeciwko ciągnięciu tej dyskusji. To kwestia nomenklatury, a nie istnieje jedna ugruntowana. Tym bardziej po polsku. Stwierdzenie "funkcja zwraca jedną zmienną" brzmiałoby nonsensownie w kontekście lekcji matematyki, a chyba dostatecznie jasno o co chodzi z jednym punktem wyjścia wyraziłem się na obrazku.

Ad w czym problem. Ująłbym to tak: potrafię wyobrazić sobie sytuację, w której zmuszony jestem użyć gazety w charakterze papieru toaletowego. Co nie zmienia faktu, że nie jest to praktyka pożądana, a tym bardziej szkodliwe byłoby uczynienie z niej standardu - zwłaszcza jeżeli mamy pod ręką rolkę.

Ad wulgaryzmy - jestem doświadczonym pedagogiem i mój warsztat metodologiczny zakłada ich szerokie wykorzystanie. Także proszę mi tu nie pierdolić.
Mariusz Jankowski

Mariusz Jankowski Programista
Excel/VBA

Temat: Ciekawy blog edukacyjny

Maciek G.:
Co innego kiedy funkcja tworzy nowy obiekt excela albo customową klasę

dim demoWorkbook as workbook
set demoWorkbook = returnDemoWorkbook

function returnDemoWorkbook as workbook
set returnDemoWorkbook = workbooks.add
end function

Z technicznego punktu widzenia to jest w porządku. Przypisujesz zmienną typu Workbook do wyniku działania funkcji (która to dodaje nowy skoroszyt). Tylko, że patrząc praktycznie to nie ma sensu, bo funkcja jest tutaj niepotrzebna i tworzymy nadmiarowy kod. Maciek, może jakiś bardzo praktyczny przykład?, bo sama idea jest ciekawa.
Jeżeli się czepiamy słówek, to tablica to nie obiekt. Nawet tablica z obiektami nie jest obiektem.
Podzielam opinię. W tablicy nie korzystamy z Set, więc nie jest ona obiektem.
Co do "jeden typ wartości" - chyba należałoby napisać - "jedną zmienną". Bo przecież "funkcja"
może "zwrócić" (byref) choćby dwa stringi
No to może "zmienną jednego typu"? ;)
Mariusz Jankowski

Mariusz Jankowski Programista
Excel/VBA

Temat: Ciekawy blog edukacyjny

Bogdan G.:
Function zwracające Boolean
Jeżeli w trakcie wykonania procedury sub wystąpiłby błąd, to w czym problem, żeby go obsłużyć zamieniając typ procedury z sub na function i badając zwracaną wartość tejże funkcji (Boolean)? Nie traktuję tego jako przepisu na standard programowania, ale czasami aż się o to prosi, żeby w ten sposób uprościć projekt i niejako hurtowo załatwić potencjalne problemy, na ogół związane z obsługą Excela. Ja często stosuję taki zabieg, jeżeli obawiam się, że nie wiem, co jeszcze może przyjść do głowy userowi i co on tam wyklika, czyli nie chcę/mogę przewidzieć wszystkich sytuacji, kiedy on coś zepsuje i program "zawędruje" w nieoczekiwanym kierunku. Jest to dla mnie taki główny bezpiecznik na wszelki wypadek.

Bardzo dobrze napisane Bodek :). To nawet porządkuje kod i zaczynam się przekonywać do tego podejścia. Można np. sprawdzić czy w funkcji wystąpił jakiś błąd i wtedy ustawić na wyjściu False, lub True - jeśli wszystko poszło ok. Zastanawiam się tylko nad obsługą błędów. W funkcji nie powinno jej być, więc może instrukcje Err.Clear i On Error Resume Next na początku funkcji?
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

Mariusz J.:
Z technicznego punktu widzenia to jest w porządku. Przypisujesz zmienną typu Workbook do wyniku działania funkcji (która to dodaje nowy skoroszyt). Tylko, że patrząc praktycznie to nie ma sensu, bo funkcja jest tutaj niepotrzebna i tworzymy nadmiarowy kod. Maciek, może jakiś bardzo praktyczny przykład?, bo sama idea jest ciekawa.


doch unsinn, to jest najlepszy i najwyżej ustrukturalizowany sposób tworzenia obiektów jaki istnieje.

W jawny sposób wchodzą argumenty, w jawny sposób wychodzi referencja. Szczegóły implementacyjne są bez znaczenia z punktu widzenia wyższej procedury.
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

acha, chyba że nie załapałeś po co to jest.
Może tak:


Sub demoSendMail()
Dim demoWorkbook As Workbook, recipents As Collection, demoMailItem As outlook.mailitem
Set demoWorkbook = returnDemoWorkbook("jakiś param potrzebny do stworzenia workbooka ")
Set recipents = returnRecipents("jakiś param potrzebny do stworzenia listy adresatów")
Set demoMailItem = returnDemoMailItem(recipents, demoWorkbook, "jakiś subject który bierze się skądśtam ale tej procedury nie interesuje skąd")
Call demoMail.send
End Sub


Function returnDemoWorkbook(sampleParam As String) As Workbook
'' tutaj cała napierdalanka, wytworzenie workbooka na podstawie parametrów
End Function



Function returnDemoMailItem(recipents As Collection, workbookToAttach As Workbook, subject As String) As outlook.mailitem
' set returnDemoMail =''' tutaj cała napierdalanka tworząca maila i załączająca do niego workbook
End Function


Function returnRecipents(sampleParam) As Collection
'' tutaj cała napierdalanka wyciągająca listę adresatów na podstawie jakiś parametrów
End Function

Ten post został edytowany przez Autora dnia 03.10.17 o godzinie 15:26
Maciek Gluszak

Maciek Gluszak McGluszak
MacroIndustries

Temat: Ciekawy blog edukacyjny

A po co to jest? Po to że opakowując tworzenie obiektów w funkcje podnosisz elastyczność swojego kodu o ok. 9000 jednostek w stosunku do sytuacji kiedy obiekty są tworzone przez suby w niekontrolowany sposób. O przejrzystości, ilości błędów i reużytkowalności nie wspominając.

Aha, a jeżeli funkcja zwróci Ci obiekt zamiast tego pożałowania godnego booleana, to obsługę błędów robisz po prostu sprawdzając czy obiekt is nothing. Był tu kiedyś jeden szajbus co próbował onanizować się brzytwą ockhama, także zwracam uwagę:
zmienna reprezentująca obiekt < zmienna reprezentująca obiek (albo jakiś posrany sposób uzyskania referencji do niego) + boolean mówiący czy udało się go stworzyćTen post został edytowany przez Autora dnia 03.10.17 o godzinie 18:07

Podobne tematy


Następna dyskusja:

Ciekawy event




Wyślij zaproszenie do