Avatar billede JKA Novice
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?
Avatar billede claes57 Ekspert
12. maj 2020 - 16:12 #1
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>&nbsp;&nbsp;
<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=''">&nbsp;DD&nbsp;</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>
Avatar billede Mads32 Ekspert
12. maj 2020 - 16:46 #2
Hej Jeg har lavet et eksempel.
Lavet med dansk exel og med lopslag.

Jeg har ingen avanceret formel for helligdage men har let et lille område hvor du kan taste datoer for helligdage ind.

Jeg tjekker lørdag og søndag med en ugedag() formel.

Der er lavet en hjælpekolonne der tjekker om datoen er en helligdag eller lørdag eller søndag.

Ved hæftet link

https://www.dropbox.com/s/ixijawucthqgll8/Formelhj%C3%A6lp%20Vagtpris_mads32.xlsx?dl=0

Jeg hører gerne dine kommentarer, om du kan bruge indlægget eller ej.
''m v h mads32
Avatar billede store-morten Ekspert
12. maj 2020 - 17:41 #3
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
Avatar billede store-morten Ekspert
12. maj 2020 - 17:58 #4
Avatar billede JKA Novice
13. maj 2020 - 11:01 #5
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 :)
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Excel-kurser for alle niveauer og behov – find det kursus, der passer til dig

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester