Microsoft Excel

Herbers Excel/VBA-Archiv

Informationen und Beispiele zum Thema MsgBox
BildScreenshot zu MsgBox MsgBox-Seite mit Beispielarbeitsmappe aufrufen
Informationen und Beispiele zum Thema Userform
BildScreenshot zu Userform Userform-Seite mit Beispielarbeitsmappe aufrufen

Datumsdifferenz ohne Sonn- und Feiertage

    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

      


    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


      


    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


      


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

    Das Goto schmerzt in den Augen!

    Gerd


      


    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


      


    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


      


    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


      


    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


      


    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


      


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




     

    Beiträge aus den Excel-Beispielen zum Thema " Datumsdifferenz ohne Sonn- und Feiertage"