Wszędzie tam, gdzie mamy do czynienia z datami, istotną właściwością konkretnej daty jest to czy jest to dzień roboczy czy nie. Z zaznaczeniem sobót czy niedziel nie ma problemu – wystarczy skorzystać z funkcji WeekDay. Pozostaje jeszcze kwestia sprawdzenia, czy nie jest to dzień świąteczny.
Moim zdaniem – najprostszym rozwiązaniem jest stworzenie tabeli świąt, w której poszczególne rekordy są datami świąt kalendarzowych. Przykładowa tabela może wyglądać tak:
Mając taką tabelę – sprawdzenie, czy dana data jest świętem (i ewentualnie jakim) jest już proste. Można to zrobić np. w kwerendzie z wykorzystaniem funkcji DCount (lub Dlookup).
Samą tabelę świąt można oczywiście wypełnić danymi ręcznie, ale zdecydowanie szybciej i prościej można zrobić to za pomocą procedury VBA.
To moja propozycja kodu:
Public Sub WstawDaty() Dim DataWielkanoc As Date Dim RST As ADODB.Recordset Dim DataP As Date Dim Rok As Integer Set RST = New ADODB.Recordset RST.Open “TabDatySwiat”, CurrentProject.Connection, adOpenDynamic, adLockOptimistic With RST For Rok = 2020 To 2025 DataWielkanoc = Wielkanoc(Rok) .AddNew !Data = DateSerial(Rok, 1, 1) !nazwaswieta = “Nowy Rok” .Update .AddNew !Data = DateSerial(Rok, 1, 6) !nazwaswieta = “Trzech Króli” .Update .AddNew !Data = DataWielkanoc !nazwaswieta = “Wielkanoc” .Update .AddNew !Data = DataWielkanoc + 1 !nazwaswieta = “2 dzień Wielkanocy” .Update .AddNew !Data = DateSerial(Rok, 5, 1) !nazwaswieta = “1 Maj” .Update .AddNew !Data = DateSerial(Rok, 5, 3) !nazwaswieta = “3 Maj” .Update .AddNew !Data = DataWielkanoc + 60 !nazwaswieta = “Boże Ciało” .Update .AddNew !Data = DateSerial(Rok, 8, 15) !nazwaswieta = “Święto Wojska Polskiego” .Update .AddNew !Data = DateSerial(Rok, 11, 1) !nazwaswieta = “Wszystkich Świętych” .Update .AddNew !Data = DateSerial(Rok, 11, 11) !nazwaswieta = “Dzień Niepodległości” .Update .AddNew !Data = DateSerial(Rok, 12, 25) !nazwaswieta = “Boże Narodzenie” .Update .AddNew !Data = DateSerial(Rok, 12, 26) !nazwaswieta = “2 dzień Bożego Narodzenia” .Update Next Rok .Close End With Set RST = Nothing End Sub —————————————————- Private Function Wielkanoc(Rok As Integer) As Date Dim Liczba As Long Dim Krotnosc As Long Dim i As Integer Liczba = DateSerial(Rok, 5, Day(Minute(Rok / 38) / 2 + 56)) For i = 0 To 6 If (Liczba – i) Mod 7 = 0 Then Krotnosc = Liczba – i Exit For End If Next i Wielkanoc = CDate(Krotnosc – 34) End Function |
W tym przykładzie tworzona jest lista świąt na lata 2020 – 2025, można oczywiście zmodyfikować do własnych potrzeb.
Warto też zwrócić uwagę na funkcję Wielkanoc, wyznaczającą datę Wielkanocy (a tym samym powiązany z nią terminem Bożego Ciała). To święto jest nietypowe, uzależnione od terminu pierwszej wiosennej pełni księżyca w danym roku. Można je jednak też obliczyć, tak jak w podanym przykładzie funkcji.
A przy okazji – w Excelu podobna lista świąt wygląda tak:
Uniwersalna lista świąt w Excelu