12. maj 2020 - 15:05
Der 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.
Er der nogen, der kan hjælpe?
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>
Prøv at lægge denne kode i et Modul:
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
Synes godt om
1 synes godt om dette
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 :)