12. maj 2020 - 15:05Der er
4 kommentarer og 1 løsning
Formelhjælp
Hej Jeg er i gang med et ark, hvor man kan notere, hvor mange timer, man har arbejdet, og så vil jeg have arket til at returnere prisen for den pågældende vagt. Ud for hver linje/vagt skal der således fremgå en pris for den pågældende vagt.
Der er én pris for en vagt på 4 timer, én for en på 5 osv., op til 13 timer. Derudover afhænger prisen af, hvorvidt det er en hverdag, en weekend eller en helligdag (helligdag og weekend er dog samme pris).
Jeg har lavet en tabel, hvor priserne fremgår, så man kan bruge den til et VLOOKUP, og jeg har lavet nedenstående formel, som tager højde for hverdag eller weekend, men jeg kan simpelthen ikke finde en metode, hvor jeg også får flettet helligdag ind. Jeg har en kolonne (J), som viser en helligdag som "1" og en hverdag som "0" =IF(H12="Hverdag";VLOOKUP(D12;$M$22:$P$31;3;TRUE);VLOOKUP(D12;$M$22:$P$31;4;TRUE))
I og med at hverdag og helligdag er samme pris, så er det reelt kun hverdage, der skal skelne mellem helligdag eller ej.
jeg har noget gammel (2005) asp-kode, der beregner helligdage inkl mors dag og advent (lavet til en blomsterbutik's kalender for 15 år siden) - det er stadig korrekt, men skal så oversættes til excel. Rutinen til helligdagsberegning kaldes for hver dato i måneden, og sætter tekst ind - lav det om til at den svarer 0/1 alt efter alm eller helligdag. Det er ikke fordi kirken er overtroisk, men de regner altså med fuldmåne... ---------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <html><head> <title>Bare end kalender...</title> <SCRIPT language=JavaScript> var browserID = "n"; if (navigator.appName.indexOf("Microsoft")>=0){browserID="i";} </script> </head> <body> <% sidenavn = LCase(Request.Servervariables("SCRIPT_NAME"))
Function getdaysinmonth(strmonth,stryear) datoen=cdate("01-" & strmonth & "-" & stryear) datoen=dateadd("m",1,datoen) datoen=dateadd("d",-1,datoen) getDaysInMonth=datepart("d",datoen) End Function
Function SkrivStortBogstav(tekst) SkrivStortBogstav=ucase(left(tekst,1)) & lcase(mid(tekst,2,len(tekst))) End Function
Function Helligdage(strdato) aar=CInt(datepart("yyyy",strdato)) 'skal være mellem 1901 & 2199 m= array(0,1,4,4,0,2,5,0,3,6,1,4,6) gyldental=(aar+1) mod 19 if gyldental=0 then gyldental=19 epakt= ((gyldental-1)*11)mod 30 if aar>1899 and aar<2200 then epakt=epakt-1 epakt=epakt mod 30 DagTilFj=80 if gyldental=6 or gyldental=17 then DagTilFj=81 alder=(epakt+DagTilFj) mod 30 if alder<=13 then antaldg=13-alder if alder>13 then antaldg=43-alder fuldmaane=21+antaldg if fuldmaane<=31 then dato=fuldmaane maaned=3 else dato=fuldmaane-31 maaned=4 end if korrektion=(5+aar+aar\4-aar\100+aar\400) mod 7 if aar/4=int(aar/4) and (maaned=1 or maaned=2) then if aar/100<>int(aar/100) then korrektion=korrektion-1 if aar/100 =int(aar/100) then korrektion=korrektion-1 end if u=(dato+m(maaned)+korrektion)mod 7 paaske=dato+7-u if paaske>31 then paaske=paaske-31 maaned=4 end if str = paaske & "-" & maaned &"-"& aar datoto = cdate("24-12-" & datepart("yyyy",strdato)) juldag = weekday(datoto, vbMonday) soendag = dateadd("d",0-juldag,datoto)
if strdato = cdate(str)-49 then Helligdage = "Fastelavn" elseif strdato = cdate(str)-7 then Helligdage = "Palmesøndag" elseif strdato = cdate(str)-3 then Helligdage = "Skærtorsdag" elseif strdato = cdate(str)-2 then Helligdage = "Langfredag" elseif strdato = cdate(str) then Helligdage = "Påskedag" elseif strdato = cdate(str)+1 then Helligdage = "2. Påskedag" elseif strdato = cdate(str)+26 then Helligdage = "St. Bededag" elseif strdato = cdate(str)+39 then Helligdage = "Kr. Himmelfartsdag" elseif strdato = cdate(str)+49 then Helligdage = "Pinsedag" elseif strdato = cdate(str)+50 then Helligdage = "2. Pinsedag" elseif strdato = cdate("1-1-" & datepart("yyyy",strdato)) then Helligdage = "Nytårsdag" elseif strdato = cdate("5-6-" & datepart("yyyy",strdato)) then Helligdage = "Grundlovsdag / Fars dag" elseif strdato = cdate("24-12-" & datepart("yyyy",strdato)) then Helligdage = "Juleaften" elseif strdato = cdate("25-12-" & datepart("yyyy",strdato)) then Helligdage = "Juledag" elseif strdato = cdate("26-12-" & datepart("yyyy",strdato)) then Helligdage = "2. Juledag" elseif strdato = cdate("31-12-" & datepart("yyyy",strdato)) then Helligdage = "Nytårsaften" elseif strdato = soendag then Helligdage = "4. søndag i Advent" elseif strdato = dateadd("ww",-1,soendag) then Helligdage = "3. søndag i Advent" elseif strdato = dateadd("ww",-2,soendag) then Helligdage = "2. søndag i Advent" elseif strdato = dateadd("ww",-3,soendag) then Helligdage = "1. søndag i Advent" else Helligdage = "" end if End Function
strtoday = Date() stryear = Year(strtoday) strmonth = Month(strtoday) If Request("month") <> "" Then strmonth = request("month") If Request("year") <> "" Then stryear = request("year")
strdaysinmonth = getdaysinmonth(strmonth,stryear) %> <table border="0" bgcolor="#C0C0C0" width="490" height="145" style="border: 1px solid #000000;"> <tr> <td> Kalender for <Select size="1" id="months" name="months" onchange="if (browserID=='n'){months = document.getElementById('months'); years = document.getElementById('years');};location.href ='<%=sidenavn%>?month='+months.value+'&year='+years.value"> <% For i = 1 To 12 Response.Write "<option value=" & i If CInt(strmonth) = i Then Response.Write " SELECTED" Response.Write "> " & SkrivStortBogstav(MonthName(i,false)) Response.Write " </option>" & vbCrLf Next %> </Select> <Select size="1" name="years" id="years" onchange="if (browserID=='n'){months = document.getElementById('months'); years = document.getElementById('years');};location.href ='<%=sidenavn%>?month='+months.value+'&year='+years.value"> <% for i = CInt(stryear)-10 to CInt(stryear)+10 Response.Write "<option value=" & i If CInt(stryear) = i Then Response.Write " SELECTED" Response.Write ">" & i & "</option>" & vbCrLf next %> </Select> </td><td align="right"> <a href="<%=sidenavn%>?month=<%=datepart("m",strtoday)%>&year=<%=datepart("yyyy",strtoday)%>" title="Vis aktuel måneds kalender" onMouseOver="window.status=''; return true" onMouseOut="window.status=''"> DD </a> </td> </tr> <tr> <td width="280" align="left" valign="top"> <table cellpadding="0" cellspacing="0" border="0" bgcolor="#FFFFFF" width="100%" height="100%" style="border: 1px solid #000000;"> <tr bgcolor="#CFCFCF"> <% for i=1 to 7 response.write "<td align=""center"" width=""40""><b>" if i=7 then response.write "<font color=""#FF0000"">" response.write SkrivStortBogstav(left(weekdayname(i,false,vbMonday),3)) if i=7 then response.write "</font>" response.write "</b></td>" next %> </tr> <tr bgcolor="#CFCFCF"><td colspan="7"><hr></td></tr> <!-- Kalender laves her --> <% datoen = CDate("01-" & strmonth & "-" & stryear) firstday = Weekday(datoen, vbMonday) aktday = 0 if (CInt(strmonth)=CInt(Month(strtoday))) and (CInt(stryear)=CInt(Year(strtoday))) then aktday = CInt(datepart("d",date)) tomme=firstday-1 if tomme>0 then response.write "<tr>" & vbCrLf lastmonth=cint(strmonth)-1 lastyear=cint(stryear) if lastmonth=0 then lastmonth=12 lastyear=lastyear-1 end if for i=1 to tomme response.write "<td align=""center"" bgcolor=""#C0C0C0"" " response.write "onclick=""location.href ='" & sidenavn & "?month=" & lastmonth & "&year=" & lastyear & "'""" response.write "><font color=""#808080"">" response.write datepart("d",dateadd("d",i-(tomme+1),datoen)) response.write "</font></td>" & vbCrLf next end if mddag=9-firstday for i=1 to strdaysinmonth if i=aktday then strItToday = "<td align=""center"" style=""border: 1px solid #000000;""><font color=""#000000"">" else strItToday = "<td align=""center""><font color=""#000000"">" end if if (7+i-mddag) MOD 7 =6 then if i=aktday then strItToday = "<td align=""center"" bgcolor=""#FF8080"" style=""border: 1px solid #000000;""><font color=""#000000"">" else strItToday = "<td align=""center"" bgcolor=""#FF8080""><font color=""#000000"">" end if end if datoen = CDate(i & "-" & strmonth & "-" & stryear) strtxt = Helligdage(datoen) if CInt(strmonth)=5 and i>7 and i<15 and (7+i-mddag) MOD 7 = 6 then if strtxt="" then strtxt = "Mors dag" else strtxt = strtxt & " / Mors dag" end if end if if len(strtxt) > 0 then if i=aktday then strItToday = "<td align=""center"" bgcolor=""#FF8080""style=""border: 1px solid #000000;"" onmouseover=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='" & strtxt & "';"" onmouseout=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='';""><font color=""#000000"">" else strItToday = "<td align=""center"" bgcolor=""#FF8080"" onmouseover=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='" & strtxt & "';"" onmouseout=""if (browserID=='n'){texter = document.getElementById('texter');}; texter.innerHTML='';""><font color=""#000000"">" end if end if if (i-mddag) MOD 7 = 0 then response.write "<tr>" & vbCrLf response.write strItToday & i & "</td>" & vbCrLf if (i-mddag) MOD 7 = 6 then response.write "</tr>" & vbCrLf next if (firstday+strdaysinmonth-1) MOD 7 > 0 then nextmonth=cint(strmonth)+1 nextyear=cint(stryear) if nextmonth=13 then nextmonth=1 nextyear=nextyear+1 end if for i=1 to 7-((firstday+strdaysinmonth-1) MOD 7) response.write "<td align=""center"" bgcolor=""#C0C0C0""" response.write "onclick=""location.href ='" & sidenavn & "?month=" & nextmonth & "&year=" & nextyear & "'""" response.write "><font color=""#808080"">" & i & "</font></td>" & vbCrLf next response.write "</tr>" end if %> <!-- Kalender slut her --> </table> </td> <td valign="top" width="190"> <table cellpadding="0" cellspacing="0" border="0" bgcolor="#FFFFFF" style="border: 1px solid #000000;" height="100%" width="100%"> <tr bgcolor="#CFCFCF"> <td><b>Dagens note:</b></td> </tr> <tr bgcolor="#CFCFCF"><td><hr></td></tr> <tr> <td height="100%" valign="top"><div id="texter" style="width:99%; height:99%;"></div></td> </tr> </table> </td> </tr> </table> </body></html>
Function DagsTypeSats(Dato As Date) As Integer 'Returnerer dagens sats (se kommentarene til select-sætningen)
'Da de kirkelige helligedage - bortset fra juledag - 'ligger et bestemt antal dage fra påskedag, beregnes forskellen 'mellem parameterdatoen og påskedag i parameterdato-året
'I en kalender er det de "bevægelige" heligdage der er svære at styre. 'Det er typerne fra 1 til 8. Den periode de kan ligge i er fra den 19-3 til den 14-6 'Det er derfor ikke nødvendigt at lægge funktion ind uden for dette område
Dim PD As Date Dim År As Integer
PD = Påskedag(Year(Dato)) År = Year(Dato)
Select Case Dato Case PD - 3: DagsTypeSats = 3 ' 1. Skærtorsdag Case PD - 2: DagsTypeSats = 3 ' 2. Langfredag Case PD + 0: DagsTypeSats = 3 ' 3. Påskedag Case PD + 1: DagsTypeSats = 3 ' 4. 2 Påskedag Case PD + 26: DagsTypeSats = 3 ' 5. Bededag Case PD + 39: DagsTypeSats = 3 ' 6. Kristi himmelfart Case PD + 49: DagsTypeSats = 3 ' 7. Pinsedag Case PD + 50: DagsTypeSats = 3 ' 8. 2 Pinsedag Case DateSerial(År, 1, 1): DagsTypeSats = 3 ' 9. Nytårsdag Case DateSerial(År, 5, 1): DagsTypeSats = 3 '10. 1 maj Case DateSerial(År, 6, 5): DagsTypeSats = 3 '11. Grundlovsdag Case DateSerial(År, 12, 24): DagsTypeSats = 3 '12. Juleaften Case DateSerial(År, 12, 25): DagsTypeSats = 3 '13. Juledag Case DateSerial(År, 12, 26): DagsTypeSats = 3 '14. 2. Juledag Case DateSerial(År, 12, 31): DagsTypeSats = 3 '15. Nytårsaften Case Else Select Case Weekday(Dato, vbMonday) Case 6: DagsTypeSats = 2 Case 7: DagsTypeSats = 2 Case Else: DagsTypeSats = 1 End Select End Select End Function
Function Påskedag(Aar As Integer) As Date
'Udregner påskedag for et givet årstal - Beregningsmetode ifl. Gauss 'Påskedag kan tidligst ligge den 22-3 og senest den 25-4
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 = Aar \ 100 p = (13 + 8 * k) \ 25 q = k \ 4 m = (15 - p + k - q) Mod 30 n = (4 + k - q) Mod 7 a = Aar Mod 19 b = Aar Mod 4 c = Aar 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
Påskedag = DateSerial(Aar, intMonth, intDay)
End Function
Så kan du teste en dato, og få en sats:
1 for hverdag 2 for weekend 3 for helligdag
Med formlen: =DagsTypeSats(A1) og datoen i celle A1
Tak for svar. mads32, din løsning duede med lidt omskrivninger til mit ark, så det var helt perfekt. Jeg havde allerede lavet helligdagsberegningen, så det var ikke den, der var et problem. Problemet var at få inkluderet det hele i én formel, og det er nu lykkedes. Tak :)
Synes godt om
Ny brugerNybegynder
Din løsning...
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.