Das Archiv des Excel-Forums

Datumsdifferenz ohne Sonn- und Feiertage

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
Bild

Betrifft: Datumsdifferenz ohne Sonn- und Feiertage
von: Det

Geschrieben am: 05.10.2003 21:30:41

Hallo alle zusammen

Ich habe ein Problem bei der Berechnung der Datumsdifferenz.
Ich möchte, dass Samstage, Sonn- und Feiertage bei der Berechnung nicht gezählt werden. (VBA)

Gruß Det
Bild


Betrifft: AW: Datumsdifferenz ohne Sonn- und Feiertage
von: Christoph
Geschrieben am: 05.10.2003 23:00:37

Hi Det,
ich kann die nicht versprechen, ob das unter Excel'97 klappt.
unter Excel2000 kannst du die Funktion "WOCHENTAG" in VBA als Application.WorksheetFunction einbinden:

If Application.WorksheetFunction.Weekday(...,...) = ... Then ...

Gruß
Christoph


Bild


Betrifft: AW: Datumsdifferenz ohne Sonn- und Feiertage
von: Panicman
Geschrieben am: 05.10.2003 23:14:54

Hallo Det,

da ich nicht weiß, aus welchem Bundesland du kommst, hab ich mal alle eingerechnet.
(Ich hoffe ich hab keinen vergessen).

A1 = Anfangsdatum
B1 = Enddatum


Option Explicit

Sub Werktage()
Dim ADat As Date
Dim EDat As Date
Dim I As Date
Dim At As Integer
Dim D As Integer
Dim Yr As Integer
'Feiertage
Dim Ostern As Date
Dim Neujahr As Date
Dim H3Könge As Date
Dim Rosenmontag As Date
Dim Karfreitag As Date
Dim Ostermontag As Date
Dim Christi_Himmelfahrt As Date
Dim Pfingstmontag As Date
Dim Fronleichnam As Date
Dim Maifeiertag As Date
Dim Nationalfeiertag As Date
Dim Erntedankfest As Date
Dim Reformationstag As Date
Dim Allerheiligen As Date
Dim Volkstrauertag As Date
Dim Buss_und_Betag As Date
Dim Totensonntag As Date
Dim erste_Weihnachtstag As Date
Dim zweiter_Weihnachtstag As Date

ADat = Range("A1").Value
EDat = Range("B1").Value

For I = ADat To EDat
    
    Yr = Year(I)
    D = (((255 - 11 * (Yr Mod 19)) - 21) Mod 30) + 21
    Ostern = DateSerial(Yr, 3, 1) + D + (D > 48) + 6 - _
             ((Yr + Yr \ 4 + D + (D > 48) + 1) Mod 7)
    
'von Ostern abhängige Feiertage
    Rosenmontag = Ostern - 48
    Karfreitag = Ostern - 2
    Ostermontag = Ostern + 1
    Christi_Himmelfahrt = Ostern + 39
    Pfingstmontag = Ostern + 50
    Fronleichnam = Ostern + 60
'Feste Feiertage
    Neujahr = DateSerial(Year(I), 1, 1)
    H3Könge = Neujahr + 5
    Maifeiertag = DateSerial(Year(I), 5, 1)
    Nationalfeiertag = DateSerial(Year(I), 10, 3)
    Erntedankfest = DateSerial(Year(I), 10, 1) + 7 - Weekday(DateSerial(Year(I), 10, 1), vbMonday)
    Reformationstag = DateSerial(Year(I), 10, 31)
    Allerheiligen = DateSerial(Year(I), 11, 1)
    Volkstrauertag = DateSerial(Year(I), 12, 25) - Weekday(DateSerial(Year(I), 12, 25), vbMonday) - 35
    Buss_und_Betag = DateSerial(Year(I), 12, 25) - Weekday(DateSerial(Year(I), 12, 25), vbMonday) - 32
    Totensonntag = DateSerial(Year(I), 12, 25) - Weekday(DateSerial(Year(I), 12, 25), vbMonday) - 28
    erste_Weihnachtstag = DateSerial(Year(I), 12, 25)
    zweiter_Weihnachtstag = DateSerial(Year(I), 12, 26)
    
    If I = Ostern Then GoTo Ende
    If I = Neujahr Then GoTo Ende
    If I = H3Könge Then GoTo Ende
    If I = Rosenmontag Then GoTo Ende
    If I = Karfreitag Then GoTo Ende
    If I = Ostermontag Then GoTo Ende
    If I = Christi_Himmelfahrt Then GoTo Ende
    If I = Pfingstmontag Then GoTo Ende
    If I = Fronleichnam Then GoTo Ende
    If I = Maifeiertag Then GoTo Ende
    If I = Nationalfeiertag Then GoTo Ende
    If I = Erntedankfest Then GoTo Ende
    If I = Reformationstag Then GoTo Ende
    If I = Allerheiligen Then GoTo Ende
    If I = Volkstrauertag Then GoTo Ende
    If I = Buss_und_Betag Then GoTo Ende
    If I = Totensonntag Then GoTo Ende
    If I = erste_Weihnachtstag Then GoTo Ende
    If I = zweiter_Weihnachtstag Then GoTo Ende
    
    If Weekday(I, vbMonday) > 5 Then GoTo Ende
    At = At + 1
    
Ende:
Next
MsgBox ("es sind " & At & " Arbeitstage")
End Sub 
     Code eingefügt mit Syntaxhighlighter 1.15



Gruß
Holger


Bild


Betrifft: AW: Datumsdifferenz ohne Sonn- und Feiertage
von: GerdW
Geschrieben am: 06.10.2003 01:26:13

Das Goto schmerzt in den Augen!

Gerd


Bild


Betrifft: @ GerdW
von: Panicman
Geschrieben am: 06.10.2003 08:47:03

Hallo Gerd,

schau doch nicht hin, oder schreib, wie du es besser machst.
Natürlich schmerzt GoTo in den Augen. Aber für ein "Then Next"
bin ich anscheinend zu blöd. Gibt nur 'ne Fehlermeldung.
Es ist aber immer wieder sehr motivierend solche Sprüche zu lesen,
ohne daraus etwas lernen zu können.

Gruß
Holger


Bild


Betrifft: 2 Möglichkeiten ohne Goto
von: Boris
Geschrieben am: 06.10.2003 10:02:47

Hi Holger,

1.)
Du fütterst in den einzelnen If-Abfragen eine Boolsche Variable (B). Nur wenn diese z.B. TRUE bleibt, dann am Ende: If B = True then At = At + 1 oder kürzer: If B then At = At + 1

2.)
Arbeite mit Select Case - alle If-Bedingungen als Case1:
Select Case I
Case Ostern, Neujahr, H3Könige....etc..etc.. - ohne irgendwas weiter
Case Else
At = At + 1
End Select

Grüße Boris


Bild


Betrifft: AW: @ GerdW
von: PeterW
Geschrieben am: 06.10.2003 10:48:01

Hallo Holger,

eine andere Möglichkeit wäre, die Feiertage in ein Array einzulesen und in einer Schleife die Elemente des Arrays auf Übereinstimmung mit dem Datum zu prüfen:

bolfeiertag = False
For Count2 = 1 To 19
If I = arr(Count2) Then
bolfeiertag = True
Exit For
End If
Next

Noch ein Hinweis, ich würde nicht in jedem Durchlauf die Feiertage neu berechnen. Das ist doch nur nach einem Jahreswechsel, der natürlich auch abgefangen werden müsste, erforderlich.

Gruß
Peter


Bild


Betrifft: Danke euch Beiden...
von: Panicman
Geschrieben am: 06.10.2003 12:39:36

Hallo Boris, Hallo Peter,

ich werde heute Abend mir mal gedanken machen, wie ich das am besten löse.
Auf jeden Fall kommt "GoTo" weg.
Ich wollte das Makro insoweit noch verändern, das die Bundesländer auch noch
berücksichtigt werden, und die Feiertage am Ende noch ausgegeben werden.

Da ich von Userforms im Moment noch gar keine Ahnung habe und ich das aber mal
lernen möchte, werde ich mir diese Aufgabe mal gönnen und versuchen ein "schnuckeliges"
Programm zu "bauen".
Das Fertige Programm werde ich vielleicht mal hier vorstellen, um es von euch Cracks noch verfeinern zu lassen.

Ihr habt mir jedenfalls sehr geholfen und nicht nur blöde Kommentare geschrieben.

Danke
Holger


Bild


Betrifft: AW: Danke euch Beiden...
von: Det
Geschrieben am: 06.10.2003 22:01:47

Halle erst einmal

Ich möchte mich bei allen bedanken, die sich mit meinem Problem beschäftigt haben.
Getestet habe ich bislang nur die Variante von Holger, die wunderbar funktioniert.
Werde auch mal die Vorschläge von Boris und Peter versuchen umzusetzen.
Übrigens Holger, ich komme aus Berlin und musste daher "leider" eine Reihe von Feiertagen löschen.

Gruß Det


Bild


Betrifft: Bitteschön, hab gern geholfen !! o.T.
von: Panicman
Geschrieben am: 06.10.2003 22:06:00




 Bild

Excel-Beispiele zum Thema " Datumsdifferenz ohne Sonn- und Feiertage"

Datumsdifferenz in der Form "12 Jahre, 3 Monate, 4 Tage" download Feststellung der beweglichen Feiertage download
Nettoarbeitstage und bewegliche Feiertage download Wochenenden und Feiertage in Jahresliste markieren download
Tagesblätter eines Monats ohne Wochenenden und Feiertage anlegen download Maximalwert für Wochenenden und Feiertage ermitteln download
Jahreskalender mit Mitarbeiterliste und Feiertagen anlegen download Bestimmte Wochentage ohne Feiertage listen download