18. juni 2003 - 22:37Der er
13 kommentarer og 2 løsninger
Kode til beregning af søn- og helligdage
Hej!
Jeg søger en kalender, som er i stand til at beregne, om en given dato er en søn- eller helligdag - herunder også en det er en skæv helligdag. Det må meget gerne være i form af ren kode...
Public Sub Dato() Dim Dato As String, D As Integer Dato = InputBox(" indtast dato") D = Weekday(Dato, vbMonday) Select Case D Case 1 dagen = "Mandag" Case 2 dagen = "Tirsdag" Case 3 dagen = "Onsdag" Case 4 dagen = "Torsdag" Case 5 dagen = "Fredag" Case 6 dagen = "Lørdag" Case 7 dagen = "Søndag" End Select MsgBox " dagen er en " & dagen End Sub
Denne funktion kan beregne om en given dato er en søn- eller helligdag. skriv en dato i fx. A1 og i B2 skriv =Isholiday(A1;Falsk;Sand)
Hvis dagen er søn/helligdag returneres Sand ellers falsk.
Function EasterSunday(InputYear As Integer) As Long ' Returns the date for Easter Sunday, does not depend on Excel 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
Function IsHoliday(lngDate As Long, InclSaturdays As Boolean, _ InclSundays As Boolean) As Boolean ' returns True if lngDate is a Norwegian holiday ' (optionally included Saturdays/Sundays) ' 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) ' Nytå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 IsHoliday = OK End Function
Jeg var også helt forundret over, hvorfor der ikke kom et indlæg fra din side, bak! Men så viser det sig jo, at du har været ude og finde det helt rigtige! En skam, at point lige var nået at blive delt ud...
Det er ok med de points, jeg har nok :-) Faktisk havde jeg selv lavet en kode, men manglede lige påskeberegningen og ville finde den på nettet. Da jeg så opdagede at at en rigtig profi havde lavet alt i forvejen,var der ligesom ingen grund til at fortsætte med min kode.....
nedenstående kode skal ændres til at ugenr altid skrives helt til højre om mandagen og ligeledes at der kan skrives i feltet selvom ugenumret står der ?
Function WEEKNR(InputDate As Long) As Integer Dim a As Integer, b As Integer, c As Long, d As Integer WEEKNR = 0 If InputDate < 1 Then Exit Function a = Weekday(InputDate, vbSunday) b = Year(InputDate + ((8 - a) Mod 7) - 3) c = DateSerial(b, 1, 1) d = (Weekday(c, vbSunday) + 1) Mod 7 WEEKNR = Int((InputDate - c - 3 + d) / 7) + 1 End Function
Function glrPåskedag(intYear As Integer) As Variant ' Udregner påskedag for et givet årstal ' Beregningsmetode ifl. Gauss Dim a As Integer Dim b As Integer Dim c As Integer Dim d As Integer Dim e As Integer Dim k As Integer Dim p As Integer Dim q As Integer Dim M As Integer Dim n As Integer Dim intDay As Integer Dim intMonth As Integer
k = intYear \ 100 p = (13 + 8 * k) \ 25 q = k \ 4 M = (15 - p + k - q) Mod 30 n = (4 + k - q) Mod 7 'Debug.Print k, p, q, m, n a = intYear Mod 19 b = intYear Mod 4 c = intYear Mod 7 d = (19 * a + M) Mod 30 e = (2 * b + 4 * c + 6 * d + n) Mod 7
If d + e <= 9 Then intDay = 22 + d + e intMonth = 3 ElseIf (d = 29) And (e = 6) Then intDay = 19 intMonth = 4 ElseIf (d = 28) And (e = 6) And (a > 10) Then intDay = 18 intMonth = 4 Else intDay = d + e - 9 intMonth = 4 End If glrPåskedag = DateSerial(intYear, intMonth, intDay) End Function
Function Helligdag(intYear As Integer, Helligdagstype As Integer) As Variant
' Returnerer datoen for de forskydelige helligdage. ' Helligdagstypen angives med en af de prædefinerede konstanter
Select Case Helligdagstype Case SKÆRTORSDAG Helligdag = glrPåskedag(intYear) - 3 Case LANGFREDAG Helligdag = glrPåskedag(intYear) - 2 Case PÅSKEDAG Helligdag = glrPåskedag(intYear) Case PÅSKEDAG2 Helligdag = glrPåskedag(intYear) + 1 Case BEDEDAG Helligdag = glrPåskedag(intYear) + 26 Case KRISTIHIMMELFARTSDAG Helligdag = glrPåskedag(intYear) + 39 Case PINSEDAG Helligdag = glrPåskedag(intYear) + 49 Case PINSEDAG2 Helligdag = glrPåskedag(intYear) + 50 End Select End Function
Function IsHelligdag(dtmDate As Variant) As Integer ' Returnerer TRUE hvis dtmDate er en helligdag Dim intYear As Integer Dim dtmPåskedag As Variant
Select Case dtmDate - dtmPåskedag Case -3, -2, 0, 1, 26, 39, 49, 50 IsHelligdag = True Case Else If (Month(dtmDate) = 1) And (Day(dtmDate) = 1) Then IsHelligdag = True ' Nytårsdag ElseIf (Month(dtmDate) = 5) And (Day(dtmDate) = 1) Then IsHelligdag = True ' 1 Maj ElseIf (Month(dtmDate) = 6) And (Day(dtmDate) = 5) Then IsHelligdag = True ' Grundlovsdag ElseIf (Month(dtmDate) = 12) And (Day(dtmDate) = 25) Then IsHelligdag = True ' Juledag ElseIf (Month(dtmDate) = 12) And (Day(dtmDate) = 26) Then IsHelligdag = True ' 2. juledag End If End Select End Function
Public Sub MAIN() Dim x Dim errtext$ Dim maaned Dim aar Dim teller Dim dag Dim datosn
Dim informationer As Object: Set informationer = WordBasic.CurValues.UserDialog
start: x = WordBasic.Dialog.UserDialog(informationer, 1) On Error GoTo -1: On Error GoTo slut If x = 0 Then GoTo slut
'Checker dataene fra dialogboksen If WordBasic.Val(informationer.mdnr$) < 1 Then errtext$ = "Månedsnummer skal være større end 0" GoTo fejl End If If WordBasic.Val(informationer.mdnr$) > 12 Then errtext$ = "Månedsnummer skal være mindre end eller lig 12" GoTo fejl End If If WordBasic.Val(informationer.aar$) < 1900 Then errtext$ = "Makroen kan ikke håndtere årstal før 1900" GoTo fejl End If If WordBasic.Val(informationer.aar$) > 4000 Then errtext$ = "Makroen kan ikke håndtere årstal større end 4000" GoTo fejl End If If WordBasic.Val(informationer.antal$) < 1 Then errtext$ = "Antallet af måneder skal være større end 0" GoTo fejl End If If WordBasic.Val(informationer.antal$) > 12 Then errtext$ = "Makroen kan maksimalt håndtere 12 måneder" GoTo fejl End If
If ((Month(dtmDate) = 5) And (Day(dtmDate) = 1)) Or ((Month(dtmDate) = 6) And (Day(dtmDate) = 5)) Then Selection.Font.Size = 8 Else WordBasic.ShadingPattern 4 End If
Case Helligdag(CInt(aar), SKÆRTORSDAG) Selection.TypeText Text:="Skærtorsdag" WordBasic.WordLeft 2
Case Helligdag(CInt(aar), LANGFREDAG) Selection.TypeText Text:="Langfredag" WordBasic.WordLeft 2
Case Helligdag(CInt(aar), PÅSKEDAG) Selection.TypeText Text:="Påskedag" WordBasic.WordLeft 2
Case Helligdag(CInt(aar), PÅSKEDAG2) Selection.TypeText Text:="2. Påskedag" WordBasic.WordLeft 4
Case Helligdag(CInt(aar), BEDEDAG) Selection.TypeText Text:="St.Bededag" WordBasic.WordLeft 4
Case Helligdag(CInt(aar), KRISTIHIMMELFARTSDAG) Selection.TypeText Text:="Kr.himmelfartsdag" WordBasic.WordLeft 4
Case Helligdag(CInt(aar), PINSEDAG) Selection.TypeText Text:="Pinsedag" WordBasic.WordLeft 2
Case Helligdag(CInt(aar), PINSEDAG2) Selection.TypeText Text:="2. Pinsedag" WordBasic.WordLeft 4
Case Else
If (Month(dtmDate) = 1) And (Day(dtmDate) = 1) Then Selection.TypeText Text:="Nytårsdag" ElseIf (Month(dtmDate) = 5) And (Day(dtmDate) = 1) Then Selection.TypeText Text:="1. Maj" ElseIf (Month(dtmDate) = 6) And (Day(dtmDate) = 5) Then Selection.TypeText Text:="Grundlovsdag" ElseIf (Month(dtmDate) = 12) And (Day(dtmDate) = 25) Then Selection.TypeText Text:="Juledag" ElseIf (Month(dtmDate) = 12) And (Day(dtmDate) = 26) Then Selection.TypeText Text:="2. Juledag" End If WordBasic.WordLeft 4
End Select
End If
Select Case WordBasic.Weekday(datosn) Case SØNDAG WordBasic.ShadingPattern 4 WordBasic.CharRight 1 Selection.Font.Size = 8
WordBasic.ShadingPattern 4 WordBasic.WordLeft 1
Case MANDAG If Not IsHelligdag(DateSerial(aar, maaned, dag)) Then WordBasic.WordRight 1 Selection.ParagraphFormat.Alignment = wdAlignParagraphRight Selection.Font.Color = wdColorBlack WordBasic.Insert Str(WEEKNR(Str(datosn)))
WordBasic.WordLeft 4 End If
Case LØRDAG WordBasic.ShadingPattern 4
Case Else
End Select
WordBasic.LineDown 1 datosn = datosn + 1 dag = dag + 1 maaned = WordBasic.Month(datosn) Wend
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.