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
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.....
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
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.
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
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