ERLANDSEN DATA CONSULTING Excel & VBA Tips   Information in English / Informasjon på engelsk

Disse websidene oppdateres ikke lengre og er kun tilgjengelig for historikken sin skyld.

Klikk her for å gå til den oppdaterte informasjonen.

Helligdager

Beregne datoen for 1. Påskedag

Dersom du vil beregne den korrekte datoen for 1. Påskedag for et angitt årstall mellom 1900 og 2078 uten å være avhengig av regnearkfunksjonene i Excel kan du benytte denne egendefinerte funksjonen:

Function EasterSunday(InputYear As Integer) As Long
' Returnerer datoen for 1. Påskedag, trenger ikke Excel for å virke
Dim d As Integer
    d = (((255 - 11 * (InputYear Mod 19)) - 21) Mod 30) + 21
    EasterSunday = DateSerial(InputYear, 3, 1) + d + (d > 48) + 6 - _
        ((InputYear + InputYear \ 4 + d + (d > 48) + 1) Mod 7)
End Function

Ut i fra denne datoen kan du beregne de andre bevegelige helligdagene i forbindelse med påsken og pinsen.

Beregne datoen for 1. Påskedag ved hjelp av en regnearkfunksjon

Tyskeren Hans W. Herber arrangerte på sin website http://www.herber.de en konkurranse for å finne den korteste regnearkfunksjonen som kunne beregne datoen for første påskedag korrekt fra år 1900 til 2078. Konkurransen avsluttet 31. mars 1999. Eksempelformlene nedenfor forutsetter at celle A1 inneholder årstallet som formelen skal benytte for å returnere datoen for 1. Påskedag.

Vinnerformelen (på engelsk) ble som følger:
=FLOOR(DAY(MINUTE(A1/38)/2+56)&"/5/"&A1,7)-34
(innsendt av Norbert Hetterich fra Tyskland).

Man kan oversette regnearkfunksjonen til en egendefinert funksjon:

Function FDOE(InputYear As Integer) As Long
' Returnerer datoen for 1. Påskedag, trenger Excel for å virke
' Etter en regnearkfunksjon av Norbert Hetterich
    FDOE = DateSerial(InputYear, 5, Day(Minute(InputYear / 38) / 2 + 56))    
    FDOE = Application.WorksheetFunction.Floor(FDOE, 7) - 34
End Function

NB! Den egendefinerte funksjonen ovenfor beregner feil dato for årene 1943, 1957, 1984, 2011, 2038 og 2052.

Dersom denne formelen oversettes til norsk, blir formelen slik:
=AVRUND.GJELDENDE.MULTIPLUM.NED(DAG(MINUTT(A1/38)/2+56)&"/5/"&A1;7)-34

Andreplassen i påskeformelkonkurransen ble denne formelen (på engelsk):
=DOLLAR((DAY(MINUTE(A1/38)/2+55)&".4."&A1)/7,)*7-6
(innsendt av Thomas Jansen, også fra Tyskland).

Oversetter man denne formelen til norsk blir den som følger:
=VALUTA((DAG(MINUTT(A1/38)/2+55)&".4."&A1)/7;)*7-6
Denne formelen er kort og grei nok til å benytte i de regnearkene som man trenger å beregne de bevegelige helligdagene.


Regne med helligdager

Funksjonen nedenfor vil returnere True hvis lngDate er en definert helligdag. Funksjonen kan inkludere eller ekskludere lørdager og søndager. Funksjonen må tilpasses for bruk i andre land enn Norge. Funksjonen er avhengig av funksjonen EasterSunday som du finner tidligere i dette dokumentet.

Function NorskHelligdag(lngDate As Long, InclSaturdays As Boolean, _
    InclSundays As Boolean) As Boolean
' returnerer True dersom lngDate er en norsk helligdag (evt. inkludert lørdag/søndag)
' benytter funksjonen EasterSunday
Dim InputYear As Integer, ES As Long, OK As Boolean
    If lngDate <= 0 Then lngDate = Date
    InputYear = Year(lngDate)
    ES = EasterSunday(InputYear)
    OK = True
    Select Case lngDate
        Case DateSerial(InputYear, 1, 1) ' 1. Nyttårsdag
        'Case ES - 4 ' Onsdag før påske
        Case ES - 3 ' Skjærtorsdag
        Case ES - 2 ' Langfredag
        Case ES ' 1. Påskedag
        Case ES + 1 ' 2. Påskedag
        Case DateSerial(InputYear, 5, 1) ' 1. mai
        Case DateSerial(InputYear, 5, 17) ' 17. mai
        Case ES + 39 ' Kristi Himmelfartsdag
        'Case ES + 48 ' Pinseaften
        Case ES + 49 ' 1. Pinsedag
        Case ES + 50 ' 2. Pinsedag
        'Case DateSerial(InputYear, 12, 24) ' Julaften
        Case DateSerial(InputYear, 12, 25) ' 1. Juledag
        Case DateSerial(InputYear, 12, 26) ' 2. Juledag
        'Case DateSerial(InputYear, 12, 31) ' Nyttårsaften
        Case Else
            OK = False
            If InclSaturdays Then
                If WeekDay(lngDate, vbMonday) = 6 Then
                    OK = True
                End If
            End If
            If InclSundays Then
                If WeekDay(lngDate, vbMonday) = 7 Then
                    OK = True
                End If
            End If
    End Select
    NorskHelligdag = OK
End Function

 

Dokumentet er sist oppdatert 2001-08-21 12:42:26      Utskriftsvennlig versjon

Brukerkommentarer:
Ole P. fra Norway skrev (2003-12-09 14:35:56 CET):
Re: Feil i EasterSunday
Funksjonen er korrigert med det manglende tegnet nå.
\-tegnet benyttes til heltallsdivisjon og returnerer ingen desimaler.
Dette er også et reservert tegn i PHP som disse websidene benytter, derfor har det falt ut...
Øystein fra Kristiansand skrev (2003-12-09 10:06:44 CET):
Re: Feil i EasterSunday
Det kan hende jeg har lagt inn formelen feil. Den gir nemlig feilmelding om man klipper den ut fra denne siden og limer den inn i en VBA modul.
Det mangler et tegn i linjen ((InputYear + InputYear 4 + d + (d > 48) + 1) Mod 7). Hva skal det stå mellom InputYear og 4 tallet ?

Jeg gjettet på divisjontegnet som medførte feilene jeg fant, ingen av de andre tegnene jeg prøvde gav bedre resultat
Ole P. fra Norway skrev (2003-12-07 10:04:11 CET):
Re: Feil i EasterSundag funksjonen ?
Det høres rart ut at EasterDay-funksjonen returnerer feil dato på disse årstallene (og flere) når du tester funksjonen på din PC.
I mine utgaver av Excel (97/2000/2002, norsk og engelsk) får jeg returnert de korrekte datoene både når jeg benytter EasterDay-funksjonen og regnearkformelen.
EasterDay-funksjonen har vært tilgjengelig på Internett i mange år uten at noen har funnet feil i funksjonen, gitt at den har vært benyttet innenfor de gitte årstallsbegrensningene (1900 - 2078).
Øystein fra Kristiansand skrev (2003-12-07 09:18:25 CET):
Feil i EasterSundag funksjonen ?
En test av EasterSunday funksjonen (Excel 2000) gav datoen for påskeaften i stedet for 1. påskedag for årene 2002, 2003, 2007, 2010, 2014, 2015 m.fl. -
Vinnerformelen til Norbert Hetterich gav derimot riktig resultat for alle år....
Ole P. fra Norway skrev (2003-11-06 21:20:29 CET):
Re: Beregne bevegelige helligdager
Funksjonen kan benyttes som en hvilken som helst annen funksjon i VBA:

Sub Test()
Dim d As Long, dCount As Long
For d = Date To Date + 90
If NorskHelligdag(d, True, True) Then
dCount = dCount + 1
End If
Next d
MsgBox "Det er " & dCount & " helligdager/helgedager de nærmeste 90 dagene!"
End Sub

Funksjonen kan også benyttes som en hvilken som helst annen regnearkfunksjon:
=Hvis(NorskHelligdag(A2;Sann;Sann);"Fridag";"Arbeidsdag")
Funksjonen kan deretter kopieres på vanlig måte for å sjekke datoer i en tabell.
Per Roar Øgaard fra perroga@online.no skrev (2003-11-06 18:02:08 CET):
Beregne bevegelige helligdager
Jeg bruker mye VBA;
men jeg forstår ikke hvordan formelen skal benyttes i praksis.
Hvordan kan den omsettes til å vikre i en tabell med datoer for f. eks 20 år framover ?

 

Erlandsen Data Consulting     http://www.erlandsendata.no/   
Excel & VBA Tips   Copyright ©1999-2017    Ole P. Erlandsen   All rights reserved
E-post kontaktadresse