Czyli funkcja VBA, która ustala faktyczny termin płatności, uwzględniająca dni wolne od pracy
Terminy płatności podatków VAT, PIT czy ZUS są z góry określone, np. VAT powinien być zapłacony do 25 dnia miesiąca. Jeśli jednak ten 25. wypada w dzień wolny od pracy – termin przesuwa się na kolejny dzień roboczy.
W Excelu są genialne funkcje, które umieją określać np. liczbę dni roboczych między dwiema datami czy datę przypadającą po określonej licznie dni roboczych (i można je wykorzystać w formule, o czym będzie w kolejnym artykule). Natomiast tutaj mamy nieco inną sytuację – potrzebujemy sprawdzić czy dany dzień jest dniem roboczym, a jeśli nie – ustalić najbliższy.
Dawno już nie było VBA na blogu, więc w tym artykule opiszę funkcję VBA, która umie taką datę ustalić.
Formatka do zadania dowolna, natomiast koniecznie musimy gdzieś w niej umieścić listę świąt, np. tak:
Do dzieła!
Założenia do funkcji VBA
Funkcja będzie potrzebowała od nas:
- daty, którą będziemy sprawdzać (czyli np. dla VAT jest to 25)
- zakresu świąt – najprościej ten zakres nazwać (ja nazwałam po prostu Swieta)
I teraz ważne:
Tak samo, jak w każdej excelowej funkcji dat, uwzględniającej święta, w zakresie świąt muszą znajdować się święta, które mają wpływ na obliczenia. Ja najbardziej polecam wrzucić wszystkie święta w interesującym nas roku i nie przejmować się tym, z jakiego miesiąca tego roku jest nasza data.
Tworzenie funkcji VBA, ustalającej termin płatności podatków
Termin płatności podatków lub oczywiście jakikolwiek inny. Nie ma znaczenia – funkcja będzie umiała okreslić dowolną datę, jak tylko dostanie od nas wymagane dane.
Stworzymy w VBA funkcję, zatem najpierw stwórzmy nowy moduł, w którym ta funkcja będzie żyła.
Ja nazwę swoją funkcję TerminPlatnosci. Będzie miała ona następujące argumenty:
- data (typ: data)
- zakres świąt (typ: zakres)
Deklaracja funkcji wygląda więc następująco:
Function TerminPlatnosci(Data As Date, Swieta As Range) As Date End Function
Kod VBA: ustalanie czy dzień jest roboczy
Sprawdzimy teraz, czy wprowadzona przez użytkownika data wypada w dzień roboczy. Jeśli tak – po temacie – mamy gotową odpowiedź. Jeśli zaś nie – będziemy zwiększać ją o jeden dzień do tej pory, aż uzyskamy dzień roboczy.
Do ustalenia czy dzień jest roboczy, wykorzystam funkcji arkusza DNI.ROBOCZE. Ponieważ Visual Basic jest Amerykaninem – użyję specjalnie dla niego angielskiej nazwy tej funkcji, czyli NETWORKDAYS.
Funkcja ta bada liczbę dni roboczych między dwiema datami (również potrzebuje zakresu ze świętami – ten mamy już określony). Jeśli tej funkcji podamy tę samą datę jako datę początkową i końcową – określimy czy ta data to dzień roboczy (wynik = 1), czy wolny od pracy (wynik = 0). Chyba napiszę o tym oddzielny wpis :).
A póki co, dalsza część kodu wygląda tak:
Dim CzyRoboczy As Boolean Do CzyRoboczy = Application.WorksheetFunction.NetworkDays(Data, Data, Swieta) If Not (CzyRoboczy) Then Data = Data + 1 Loop Until CzyRoboczy
Zauważ, że zmienna CzyRoboczy to zmienna logiczna. Przypisałam do niej wartość, jaką zwróci funkcja NETWORKDAYS. A ona zwróci liczbę. Jeśli więc ta liczba będzie równa zero, dla funkcji będzie to równoznaczne z FAŁSZEM. Jeśli zaś jeden (tutaj nie przewiduję innej opcji ;)) – będzie to oznaczało PRAWDĘ. Mówiłam o tym spoooro podczas szkolenia online o logice bez funkcji logicznych.
Na koniec jeszcze tylko przypisanie wyniku i zakończenie funkcji:
TerminPlatnosci = Data End Function
Całość (z moimi komentarzami) wygląda tak:
Function TerminPlatnosci(Data As Date, Swieta As Range) As Date 'czy roboczy Dim CzyRoboczy As Boolean Do CzyRoboczy = Application.WorksheetFunction.NetworkDays(Data, Data, Swieta) If Not (CzyRoboczy) Then Data = Data + 1 Loop Until CzyRoboczy TerminPlatnosci = Data End Function
Tadam! I po krzyku :).
Na koniec mam do Ciebie prośbę: pomożesz mi dotrzeć z tym artykułem do szerszego grona? Jeśli zechcesz udostępnić ten artykuł na Facebooku – będę Ci bardzo wdzięczna! Bardzo się starałam, aby ten artykuł był dla Ciebie na tyle wartościowy, by wart był wzmianki ;). Oczywiście śmiało podeślij go innym osobom mailem lub Messengerem. Będzie mi bardzo miło:)
Powiązane produkty
- Logika bez funkcji logicznych – podczas tej lekcji nauczysz się korzystać z logiki bez użycia funkcji logicznych (takich jak ORAZ czy LUB). Okazuje się, że często bardzo ułatwia i przyspiesza to naszą pracę. Dodatkowo dowiesz się jak stosować logikę w narzędziach Excela takich jak sprawdzanie poprawności czy formatowanie warunkowe.
- Nagrywanie makr – podczas tej dwugodzinnej lekcji dowiesz się jak w sprytny sposób nagrywać całkiem inteligentne makra
- Funkcje dat – excelowy niezbędnik – lekcja omawiająca najważniejsze funkcje dat, które pozwolą Ci w prosty sposób dokonywać obliczeń na datach, bez kombinowania jak koń pod górę.
MalinowyExcel Funkcja VBA Płatność VAT 25 DW.zip
I film na Youtubie, gdzie pokazuję powyższe rozwiązanie:
Fajnie, tylko po co tworzyć nową funkcję VBA skoro połączenie dwóch jużistniejących robi to samo:
=JEŻELI(NETWORKDAYS(E6;E6;Swieta)=0;WORKDAY(E6;1;Swieta);E6)
Hej, pewnie – da się nawet prościej, o czym będzie w kolejnym artykule. Funkcja VBA, ponieważ: „Dawno już nie było VBA na blogu, więc w tym artykule opiszę funkcję VBA, która umie taką datę ustalić.”
Hey
To są funkcje z Excel angielskiego .
Jak brzmią w wersji polskiej i jaki Excel masz?
Bardzo ciekawa funkcja. Skopiowałem sobie do takich swoich plików.
Zastanawiam się, jak przygotować funkcję (lub VBA), która określi i pokaże mi czwarty dzień roboczy miesiąca, biorąc pod uwagę soboty, niedziele i inne święta (określone w ustawie, czy rozporządzeniu).
Z pozdrowieniami
Andrzej
Hej Andrzej 🙂
Ja bym tutaj użyła już nie VBA, a Dzień.Roboczy liczony od ostatniego dnia poprzedniego miesiąca. Zobacz, analogicznie do tego artykułu.
Oczywiście chodzi o czwarty dzień roboczy miesiąca.