Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Differenz Tage ohne Wochenende

Begonnen von Problemkind, Heute um 10:13:12

⏪ vorheriges - nächstes ⏩

Problemkind

Hallo, ich mal wieder aus dem hohen Norden..

Ich habe viel gesucht, viel gelesen und leider wenig verstanden.

Ich habe eine Tabelle mit den Feldern [Beginn_Inst] und [Ende_Inst]. Daraus möchte ich die Anzahl der Tage unter der Nutzung einer Abfrage ermitteln. Mit DatDiff[Ende_Inst]-[Beginn_Inst] auch kein Thema.
Jetzt möchte ich aber die Wochenenden "raus rechnen".

Ich habe eine weitere Tabelle [tab_Wochentage] erstellt, mit den 7 Wochentagen (1=Sonntag, 2=Montag usw.) oder brauche ich eine Tabelle mit den 365 Tage und wenn ja wie aufgebaut?

Wie müsste dann die Abfrage lauten, damit die Wochenenden nicht mitgerechnet werden?

Ich bedanke mich schon einmal im Vorwege und hoffe auf leicht verständliche Lösungen (ich bin ja noch am lernen..)

Gruß

Frank

andyfau

Moin,
Du benötigst keine Extratabellen, sondern nur Start und Endedatum:

Function ArbeitstageZaehlen(StartDate As Date, EndDate As Date) As Long
    Dim CurrentDate As Date
    Dim WorkingDays As Long
   
    CurrentDate = StartDate
    WorkingDays = 0
   
    Do While CurrentDate <= EndDate
        ' Wochentag prüfen (vbMonday = 2, vbSunday = 1)
        ' 1 = Sonntag, 7 = Samstag
        If Weekday(CurrentDate, vbMonday) <= 5 Then ' Montag bis Freitag (1 bis 5)
            WorkingDays = WorkingDays + 1
        End If
        CurrentDate = CurrentDate + 1 ' Nächster Tag
    Loop
   
    ArbeitstageZaehlen = WorkingDays
End Function

Um Feiertage auszuschließen wird es dann etwas aufwendiger. Der einfache Weg: eine zusätzliche Feiertagstabelle. Der elegante Weg: eine zusätzliche Feietagsfunktion.....
Beste Grüße
Andreas

Knobbi38

#2
Hallo Frank,

für solche Aufgaben eignen sich Kalendertabellen hervorragend. Dort werden dann nur die Tage mit Wochentag <> (Samstag, Sontag) in der Where-Bedingung gezählt. So können auch sehr einfach Feiertage und andere freie Tage berücksichtigt werden. 

Knobbi38

Siehe auch hier im Forum oder
https://www.tksoft-online.de/ms-access/bsp-db-s/bsp-downloads-datum-und-zeit.html
 

MzKlMu

Hallo,
ich würde auch unbedingt eine Kalendertabelle anlegen. Dann wird das Vorhaben zu einem Kinderspiel. Auch Feiertage lassen sich damit integrieren.
Ich habe vor einer Zeit dazu mal ein beispiel gemacht. Siehe Anhang.
Die Jahreszahlen in den Erläuterungen stimmen natürlich nicht mehr.
Gruß Klaus

Problemkind

Hallo an alle,

vielen Dank für die Tipps, funktioniert super.
Habe es umgesetzt, auch wenn Ü61 etwas länger dafür gebraucht hat.

Ich habe erst einmal den Tipp von andyfau umgesetzt, die anderen probiere ich aber auch noch. Brauche halt etwas länger.

Danke und Gruß

Frank

andyfau

Der Vollständigkeit halber hier noch das Modul zu Feiertagsberechnung ohne irgendwelche Zusatztabellen:

Option Compare Database
Option Explicit

Public Function Ostersonntag( _
    Optional ByVal Jahr As Integer _
  ) As Variant
  Dim D1 As Integer
  Dim D2 As Integer
  Dim D3 As Integer
  Dim D4 As Integer
 
  'Formel nach C.F.Gauss gilt 1583 - 8202:
  If Jahr = 0 Then Jahr = Year(Now)
  If Jahr < 1583 Or Jahr > 8202 Then _
      Err.Raise 5 'Invalid argument'
 
  'Berechnung der Korrekturwerte:
  D1 = (8 * (Jahr \ 100) + 13) \ 25 - 2
  D2 = (Jahr \ 100) - (Jahr \ 400) - 2
  D1 = (15 + D2 - D1) Mod 30
  D3 = 2 * (Jahr Mod 4) + 4 * (Jahr Mod 7)
  D4 = (D1 + 19 * (Jahr Mod 19)) Mod 30
  If D4 = 29 Then
    D4 = 28
  ElseIf D4 = 28 Then
    If (Jahr Mod 19) > 10 Then D4 = 27
  End If
  D3 = (6 + D2 + D3 + 6 * D4) Mod 7
 
  'Berechnung des Datums (ausgehend vom 22.3.):
  Ostersonntag = DateSerial(Jahr, 3, 22 + D4 + D3)
End Function
Public Function FeiertagV( _
    Optional ByVal Datum As Variant _
  ) As String
  Dim Tage As Integer
 
  If IsMissing(Datum) Then Datum = Now
  Tage = DateDiff("d", Ostersonntag(Year(Datum)), Datum)
  Select Case Tage 'relativ zu Ostersonntag
  Case -2: FeiertagV = "Karfreitag"
  Case 0:  FeiertagV = "Ostersonntag"
  Case 1:  FeiertagV = "Ostermontag"
  Case 39: FeiertagV = "Christi Himmelfahrt"
  Case 49: FeiertagV = "Pfingsonntag"
  Case 50: FeiertagV = "Pfingstmontag"
  Case 60: FeiertagV = "Fronleichnam"
  End Select
End Function
Public Function Feiertag( _
    Optional ByVal Datum As Variant _
  ) As String
  Dim TagMonat As Integer
 
  If IsMissing(Datum) Then Datum = Now
  TagMonat = Day(Datum) * 100 + Month(Datum)
  Select Case TagMonat 'im Format DDMM
   Case 101: Feiertag = "Neujahr"
   Case 601: Feiertag = "Dreikönigstag *"
   Case 105: Feiertag = "Tag der Arbeit"
  Case 1508: Feiertag = "Mariä Himmelfahrt *"
   Case 310: Feiertag = "deutsche Einheit"
   Case 111: Feiertag = "Allerheiligen"
  Case 2412: Feiertag = "Heiligabend *"
  Case 2512: Feiertag = "1. Weihnachtstag"
  Case 2612: Feiertag = "2. Weihnachtstag"
  Case 3112: Feiertag = "Silvester *"
  Case Else: Feiertag = FeiertagV(Datum)
  End Select
End Function
Function IstFeiertag( _
    Optional ByVal Datum As Variant _
  ) As Boolean
  IstFeiertag = Len(Feiertag(Datum)) > 0
End Function
Private Sub Form_Click() 'Gibt alle Feiertage eines Jahres aus
  Dim Jahr As Integer
  Dim Datum As Variant
 
  'Cls
  Jahr = Year(Now)
  Debug.Print "Feiertage im Jahr"; Jahr
  For Datum = DateSerial(Jahr, 1, 1) To DateSerial(Jahr, 12, 31)
    If IstFeiertag(Datum) Then Debug.Print Datum, Feiertag(Datum)
  Next Datum
End Sub


Beste Grüße
Andreas