• Zapisz się do newslettera, aby otrzymywać powiadomienia o nowościach na blogu
    Zapisując się, wyrażasz zgodę na przesyłanie Ci informacji o nowościach na tym blogu. Zgodę możesz w każdej chwili wycofać (szczegóły).

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

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:

 

 

 

Spodobał Ci się ten artykuł?

Jeśli TAK, zapisz się na newsletter, aby otrzymywać powiadomienia
o o nowościach na blogu.

Zapisując się, wyrażasz zgodę na przesyłanie Ci informacji o nowościach na tym blogu. Zgodę możesz w każdej chwili wycofać (szczegóły).

Tagi , , , , , , , , , .Dodaj do zakładek Link.

2 odpowiedzi na „Termin płatności VAT-u, PIT-u i ZUS-u

  1. robik mówi:

    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)

    • Malina mówi:

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

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *