fbpx

VBA: Termin płatności VAT-u, PIT-u i ZUS-u

06.11.2020 | Daty i czas, ECP3, Makra VBA, Nazwy, Podatki

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:

Formatka

Do dzieła!

Założenia do funkcji VBA

Funkcja będzie potrzebowała od nas:

  1. daty, którą będziemy sprawdzać (czyli np. dla VAT jest to 25)
  2. 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:

  1. data (typ: data)
  2. 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ę.

 

Plik do pobrania:

MalinowyExcel Funkcja VBA Płatność VAT 25 DW.zip

 

I film na Youtubie, gdzie pokazuję powyższe rozwiązanie:

 

 

 

Jeżeli chcesz lepiej poznać makra i VBA zapisz się na listę zainteresowanych kursem Excel w codziennej pracy cz. 3! Podczas oczekiwania na kurs będę Ci wysyłała informacje, ciekawostki i excelowe triki. Bezpłatnie! 

Pomogłam Ci? Postaw mi wirtualną kawę! →

Przeczytaj podobne wpisy

Kategorie

6 komentarzy

  1. 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)

    Odpowiedz
    • 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ć.”

      Odpowiedz
    • Hey
      To są funkcje z Excel angielskiego .
      Jak brzmią w wersji polskiej i jaki Excel masz?

      Odpowiedz
  2. 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

    Odpowiedz
    • 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.

      Odpowiedz
  3. Oczywiście chodzi o czwarty dzień roboczy miesiąca.

    Odpowiedz

Wyślij komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *