Lista świąt w Accessie

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

 


Kurs Access - programowanie w VBA

Leave a Reply