04. februar 2006 - 09:29Der er
15 kommentarer og 1 løsning
Skal tælle timer, hvis dato IKKE er helligdag eller weekend.
Hej,
Jeg har følgende formel, som tæller om der står "F" i en celle i en hel række med datoer fra 1-31:
=HVIS($B6="";"";TÆL.HVIS(C6:AG6;"F")*7,4)
Hvis der står "F", skal den tælle 7,4. Jeg vil meget gerne, at datoen er en helligdag eller weekend, så skal den IKKE tælle 7,4 selv om der står "F" i en eller flere celler. Så på en eller anden måde, vil jeg altså gerne have puttet dette ind i formlen:
HVIS(ErHelligdag(C6:AG6;FALSK;FALSK)
så den ikke tæller, hvis "F" står på en helligdag eller i weekenden.
Dog HAR jeg skam allerede brugt fritekst-søgningen og fundet et hav af indlæg, som omhandler helligdage. Selv om jeg fandt meget, så har jeg altså ikke fundet noget, som kan hjælpe mig med mit specifikke problem!
Sættes ind i et modul (kunne ikke finde oprindelig kilde, men Bak har indsat det i et spørgsmål) Tilføjelsesprorammerne Analysis ToolPak & Analysis ToolPak-VBA indstalleres 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
Åh... excelent, selve funktionen ErHelligdag HAR jeg allerede med i mit skema med datoerne; det er ikke DET, det er problemet. Problemet er "kun" selve formlen, som jeg vil have til at tælle 7,4 timer for alle hverdage hvis der står "F" i cellen. Som formlen er nu, så tæller den 7,4 timer på alle dage, incl. week-ender og helligdage.
Håber jeg har gjort mig lidt mere forståelig nu! Sorry, hvis du har misforstået mig!
ok, så skal vi nok ha fat i ANTAL.ARBEJDSDAGE el ARBEJDSDAG vil gerne forsøge at hjælpe, men andre må gerne blande sig det vil være lettere for mig at overskue problemet hvis du viser lidt mere af hvordan din beregninger ser ud
eks 1] C D E 2] 3] 4] 5] 1-1-2006 2-1-2006 3-1-2006 6] F F 7] FALSK FALSK 7,4
i dette eksembel skal der indsættes en exta række til beregning i cellerne C7 indsætes følgende formel, kopier den herefter til resten af rækken =HVIS(C6="F";HVIS(Isholiday(C5;FALSK;SAND)=FALSK;HVIS(ANTAL.ARBEJDSDAGE(C5;C5)=1;7,4))) så får du nogle celler med 7,4 som du kan summere
isholyday(celle;FALSK;SAND) er den funktion jeg fik ved at hente funktionen fra tidligere omtalte spørgsmål mit bedste bud lige nu :-)
jeg kan se at den funktion du bruger til at teste om en given dato er en helligdag eller ej, ikke er den samme som min kan jeg få en kopi, eller henvisning? Point går naturligvis til dig idet du fandt en løsning v.h.Poul
Først funktionen "ErHelligdag": *************** Function ErHelligdag(ByVal TestDato As Long, _ Optional ByVal InclLørdage As Boolean = True, _ Optional ByVal InclSøndage As Boolean = True) As Boolean
Dim InputYear As Integer, PD As Long, OK As Boolean If TestDato <= 0 Then TestDato = Date InputYear = Year(TestDato) PD = Påskedag(InputYear) OK = True Select Case TestDato Case DateSerial(InputYear, 1, 1) ' Nytårsdag Case PD - 7 ' Palmesøndag Case PD - 3 ' Skærtorsdag Case PD - 2 ' Langfredag Case PD ' Påskedag Case PD + 1 ' 2. påskedag Case PD + 26 ' St. Bededag Case PD + 39 ' Kristi Himmelfartsdag Case PD + 49 ' Pinsedag Case PD + 50 ' 2. Pinsedag Case DateSerial(InputYear, 12, 25) ' Juledag Case DateSerial(InputYear, 12, 26) ' 2. Juledag Case DateSerial(InputYear, 12, 31) ' Nytårsaftensdag Case Else OK = False If InclLørdage Then If Weekday(TestDato, vbMonday) = 6 Then OK = True End If End If If InclSøndage Then If Weekday(TestDato, vbMonday) = 7 Then OK = True End If End If End Select ErHelligdag = OK End Function
****************
Og nu funktionen, der klarer påsken: ****************
Function Påskedag(InputYear As Integer) As Long Dim d As Integer d = (((255 - 11 * (InputYear Mod 19)) - 21) Mod 30) + 21 Påskedag = DateSerial(InputYear, 3, 1) + d + (d > 48) + 6 - _ ((InputYear + InputYear \ 4 + d + (d > 48) + 1) Mod 7) End Function
***************
Funktionen "UgeNr":
*************** Function UgeNr(Dato) UgeNr = Format(Dato, "ww", vbMonday, vbFirstFourDays) End Function *************
Håber du kan bruge dem til noget! Takker dig også for tiden, du har brugt på mit spørgsmål!
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.