dr.cornwallis
Goto Top

Access 2010 Abfrage erster Werktag

Liebe Gemeinde,

wie oben bereits beschrieben bräuchte ich einen Filter bzw. Kriterium für ein Datumsfeld(oder einen VBA Code den ich garantiert nicht alleine hinkriege):

1. Abfrage: erster Werktag des aktuellen Monats
2. Abfrage: fünfter Werktag des aktuellen Monats

Bis jetzt hätte ich das Ganze mit SELECT TOP 1 und einer Wochentags Bedingung gelöst(2= Montag, 6= Freitag), bei zb. diesen Monat führt dies aber zu Problemen da der erste Montag der 05.09 und der erste Freitag der 02.09 ist.

Ziel dieser Abfrage soll eine Hochrechnung werden, die aus der Differenz der ersten 5 Werktage einen Wert ermittelt(quasi aus den ersten 5 Werktagen des Monats).
Jetzt nimmt er die Daten von Fr-(02.09) bis MO(05.09), sprich aus 4 Tagen, wobei 2 davon keine Werktage sind=keine Daten vorhanden.

SQL CODE der beiden querys(Query1):
SELECT TOP 1 Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Wochenstunden.Korridorstunden AS Korridor, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage] AS Hochrechnung, Datentage.Arbeitstage, Wochenstunden.Korridorstunden
FROM ((Korridor_Daten INNER JOIN Rohdaten ON Korridor_Daten.OrgEinh = Rohdaten.[OrgEinh#]) INNER JOIN Wochenstunden ON Korridor_Daten.PersNr = Wochenstunden.PersNummer) INNER JOIN Datentage ON Korridor_Daten.Periode = Datentage.Datum
WHERE (((Weekday([Periode]))=6) AND ((Month([Periode]))=Month(Date())) AND ((Year([Periode]))=Year(Date())))
GROUP BY Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage], Datentage.Arbeitstage, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden
HAVING (((Rohdaten.[DM Bereich])=[Formulare]![frm_DM]![txtOrgEinh]) AND (((([Anzahl]-[Korridorstunden])/5)*[Arbeitstage])>0))
ORDER BY Korridor_Daten.Periode;

Query 2:
SELECT TOP 1 Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Wochenstunden.Korridorstunden AS Korridor, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage] AS Hochrechnung, Datentage.Arbeitstage, Wochenstunden.Korridorstunden
FROM ((Korridor_Daten INNER JOIN Rohdaten ON Korridor_Daten.OrgEinh = Rohdaten.[OrgEinh#]) INNER JOIN Wochenstunden ON Korridor_Daten.PersNr = Wochenstunden.PersNummer) INNER JOIN Datentage ON Korridor_Daten.Periode = Datentage.Datum
WHERE (((Weekday([Periode]))=2) AND ((Month([Periode]))=Month(Date())) AND ((Year([Periode]))=Year(Date())))
GROUP BY Korridor_Daten.Mitarbeiter, Korridor_Daten.PersNr, Korridor_Daten.OrgEinh, Korridor_Daten.MAKreis, Rohdaten.Kostenstelle, Rohdaten.ZUBA, Rohdaten.[DM Bereich], Korridor_Daten.Periode, Korridor_Daten.Anzahl, (([Anzahl]-[Korridorstunden])/5)*[Arbeitstage], Datentage.Arbeitstage, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden, Wochenstunden.Korridorstunden
HAVING (((Rohdaten.[DM Bereich])=[Formulare]![frm_DM]![txtOrgEinh]))
ORDER BY Korridor_Daten.Periode;

Bitte um Hilfe!


Vielen Dank!


Gruß

Dr.

Content-Key: 315809

Url: https://administrator.de/contentid/315809

Printed on: April 26, 2024 at 03:04 o'clock

Member: ukulele-7
ukulele-7 Sep 21, 2016 at 14:05:35 (UTC)
Goto Top
In MSSQL würde das hier eventuell helfen:
SELECT	( CASE datepart(dw,dateadd(month,datediff(month,0,getdate()),0)) WHEN 1 THEN getdate()+1 WHEN 6 THEN getdate()+2 ELSE getdate() END )
Wenn du jetzt aus getdate() dein Datum machst würdest du eigentlich immer den ersten Werktag des Monats aus dem Datum bekommen.

Ob die Datums-Funktionen in Access alle gleich lauten weiß ich nicht aber es könnte sich übersetzen lassen.
Member: Biber
Biber Sep 21, 2016 at 15:03:05 (UTC)
Goto Top
Moin Dr.Conwallis,

denkst du da nicht zu kompliziert mit den ersten Montagen und Freitagen des Monats?

In deinem Dateinkontext müsste es doch immer nur um die ersten 5 Tage des relevanten Monats gehen, für die auch Daten vorliegen.
Egal, ob der 1. der Monats an einem Dienstag, Freitag oder einem Donnerstag ist.

Also bau doch in deine Komplett-Query anstatt der obiger Querys eine Datumsgrenze ein
SELECT 
 ( irgendwas von Korridor_Daten)
....
 WHERE Korridor_Daten.Periode IN
  ( Select TOP 5 x.Periode  From 
            (SELECT Distinct Periode from Korridor_Daten 
              Where month(periode) = month(date())
              And year(periode) = year(date())
 ) as x
Order by 1
)

AND ... (deine anderen WHERE-Kriterien, falls gegeben)
 ..... 
Ungetestet natürlich

Die ersten 5 tatsächlich vorhandenen Tage sind valider herauszufieseln als die 5 ersten Arbeitstage unter Berücksichtung von Ostermontag und regional unterschiedlich gehandhabten Feiertagen.

Grüße
Biber
Member: Dr.Cornwallis
Dr.Cornwallis Sep 22, 2016 updated at 09:21:38 (UTC)
Goto Top
Moin,

ok da dürfte ich mich wohl nicht korrekt ausgedrückt haben...

Ich bräuchte in der 1. Abfrage den 1. Werktag des Monats, sprich der erste vorhandene Datensatz im akt. Monat, glaube das schaffe ich noch soweit..

Bei der 2. Abfrage bräuchte ich den 5. Werktag bzw. den 5. vorhandenen Datensatz vom aktuellen Monat(bezogen auf ein Datumsfeld)

Aus diesen beiden kann ich dann eine Differenz errechnen, mit dieser dann eine Hochrechnung(Monatsende).

Ich stelle mir das Ganze so vor:
1. Query: SELECT TOP 1
2. QUERY SELECT TOP 5 ???? und dann wüsste ich nicht wie ich ihm sage dass er die ersten 4 ignorieren bzw. nicht ausgeben soll. sofern das überhaupt möglich ist.


Danke für eure Hilfe!


Gruß

Dr.
Member: Biber
Biber Sep 22, 2016 updated at 13:38:36 (UTC)
Goto Top
Moin Dr. Cornwallis,

ja nee, überzeugt hast du mich überhaupt nicht mit der TOP 1/TOP 5-Mimik.
Kann doch nicht sein, dass so eine halbseitige Abfrage mit GROUP BY und TOP 1 nötig ist, um den ersten Werktag des Monats rauszufieseln und eine weitere separate Query gleichen Umfangs für den 5ten Werktag.

Aber gut, so fit bin ich nicht in SQL.

Wenn ich denn den ersten bzw 5. Werktag des aktuellen Monats in deiner Korridor_daten finden sollte mit SQL-Mitteln wäre das:

  • Erster vorhandener Werktag des aktuellen Monats:
SELECT min(periode) as Werktag1DesMonats
From Korridor_daten 
WHERE ( Month(Periode)=Month(Date() AND Year(Periode)=Year(Date() ) 
Der kleinste Datumswert des aktuellen Monats.... was soll da schiefgehen?


  • Fünfter vorhandener Werktag des aktuellen Monats:
Select max(periode) as Tag5desMonats FROM (
   SELECT TOP 5 Periode From (
       SELECT distinct periode  as periode   
       From Korridor_daten 
       WHERE ( Month( Periode)=Month(Date() AND Year(Periode)=Year(Date() ) 
) as alleTageDesMonats
ORDER BY periode
) as dieTop5

Wie gesagt, ich sehe aber keinen Bedarf für die 2 Extra-Querys.
Diese beiden Tage bzw. das SQL für deren Ermittlung kannst du doch direkt in dein Statement zur Berechnung der 5-Tage-Summierung einbauen:

SELECT ...(deine 5-Tage-Auswertung)
FROM Korridor_daten
WHERE periode BETWEEN ( erstes Statement in Klammern )  
                            AND  (zweites Statement in Klammern)

Aber in meinem Kommentar oben habe ich doch gezeigt, dass du gar nicht den ersten Werktag namentlich kennen musst - es reichen doch die ersten 5 Werktage OHNE die Information, wie der erste und der fünfte nun heisst.

Grüße
Biber
[Edit] Die Statements sind ungetestet - ob alle Klammern paarig sind... weiss ich nicht.
Ein paar überflüssige habe ich noch rausgelöscht, aber evtl ist Nacharbeit nötig. [/Edit]
Member: Dr.Cornwallis
Dr.Cornwallis Sep 22, 2016 at 12:19:29 (UTC)
Goto Top
Hi Biber!

Okay, danke für deine Hilfe

Als 1. Werktag(oder sagen wir einfach Tag) meinte ich auch den ersten vorhandenen Datensatz im aktuellen Monat, egal ob das nun ein Mo, Di, Mi etc. ist.
Als 5. Werktag meinte ich dann quasi 5 Tage bzw. Datensätze weiter, ist also zb. wie aktuell der 1.9.2016 der erste Datensatz, dann muss der "fünfte" der 7.9 sein (außer es waren Feiertage oder ähnliches dazwischen, dann verschiebt sich das Ganze noch weiter nach hinten.

Ich werde mal probieren dass ich deinen Code einbaue, gebe dir Bescheid sobald/ob ich es geschafft habe. face-smile

Vielen Dank!


Gruß Dr.
Member: ukulele-7
ukulele-7 Sep 22, 2016 at 13:35:29 (UTC)
Goto Top
Also zwei Sachen sind mir nicht ganz klar:
1) Beinhaltet deine Tabelle nur Werktage oder auch nicht-Werktage, die dann aber nicht berücksichtigt werden dürfen?
2) Wenn du zu einem Monat z.B. 5 Tage hast
2. Monatag
3. Dienstag
9. Montag
10. Dienstag
11. Mittwoch
Suchst du dann den 2. und den 11. oder den 2. und den 6. (Freitag)?
Member: Dr.Cornwallis
Dr.Cornwallis Sep 22, 2016 updated at 13:44:00 (UTC)
Goto Top
1. Der Table beinhaltet nur Werktage(MO-Fr)
2. Beispiel September 2016: 1. vorhandener Datensatz: 01.09.2016(Donnerstag), 5. vorhandener Datensatz: 07.09.2016(MIttwoch)
Im Mai 2016 wäre der 1. Datensatz der 02.05(Montag, da der 01.05 ein Sonntag ist, dazu würde ich noch den 06.05(Freitag) benötigen
Mit diesen beiden Werten wird dann berechnet.

Gruß
Member: Biber
Biber Sep 22, 2016 at 13:58:48 (UTC)
Goto Top
Moin ukulele-7,

Berechtigte Nachfragen....

In den Monster-Selects ganz oben macht er ja einen INNER JOIN von der Korridordate.Tabelle auf eine Tabelle Arbeitstage. Wenn in der letzteren nur die zu berücksichtigen Arbeitstage stehen (in der Regel Mo-Fr), dann würden eh alle anderen Daten weggefiltert werden, z.B. wenn in der Korridor_daten Datensätze für einen Sonntag stehen.
Aber du hast Recht mit deinen Bedenken - wenn denn tatsächlich derartige Sonntags-Daten vorhanden sind, dann kommt bei meiner TOP-5-Mimik etwas Verkehrtes raus.

Grüße
Biber
Member: ukulele-7
ukulele-7 Sep 22, 2016 at 15:41:27 (UTC)
Goto Top
Nun mein Beispiel hat bewusst keinen Datensatz für den 1. des Beispielmonats (welches Jahr, welcher Monat ist egal). Dann scheinst du ja nicht nur nur Werktage zu haben sondern auch lückenlose Einträge aller Werktage, das ist dann schon für diesen Fall ideal.

Bibers Ansatz ist auf jedenfall richtig und du hast ja auch schon als gelöst markiert, habe ich erst gar nicht gesehen. Man muss sich natürlich im klaren sein was passiert wenn wirklich mal Datensätze fehlen, wenn das nicht vorkommen kann dann kannst du dich in jedem Fall glücklich schätzen face-smile
Member: Dr.Cornwallis
Dr.Cornwallis Sep 26, 2016 at 12:54:45 (UTC)
Goto Top
Moin,

ein Kollege(VBA Pro) hat mir geholfen, hier der Code(gibt 1. und 5 Arbeitstag im aktuellen Monat aus),für alle die die selbe Funktion mal benötigen, funktioniert perfekt:

Option Compare Database

Option Explicit
'// ----------------------------------------------------------------  
'// Feiertagsberechnung nach dem Algorithmus von Carl Friedrich Gauß  
'// ----------------------------------------------------------------  
Type AtFeiertage
     Jahreszahl         As Long
     Ostern             As Date
     Neujahr            As Date
     DreiKoenige        As Date
    'Rosenmontag        As Date  
    'Aschermittwoch     As Date  
    'Karfreitag         As Date  
     Ostersonntag       As Date
     Ostermontag        As Date
     Maifeiertag        As Date
     ChrHimmelfahrt     As Date
     Pfingstsonntag     As Date
     Pfingstmontag      As Date
     Fronleichnam       As Date
     MariaeHimmelfahrt  As Date
     Nation             As Date
    'Reformationstag    As Date  
     Allerheiligen      As Date
    'Heiligabend        As Date  
     Weihnachten1       As Date
     Weihnachten2       As Date
    'Sylvester          As Date  
End Type
 
Dim m_uDTF As AtFeiertage
'Dim x As String  

 
 
Public Function Feiertag(mdatum As Date, FeiertagsName As String) As Integer
 
   Dim Jahreszahl As Integer
   Dim mbol As Integer
   
   Jahreszahl = DatePart("yyyy", mdatum)  
    
   mbol = 0

'// Als Refrenzdatum zunächst m_uDTF.Ostern berechnen  
    If Not Ostern_berechnen(Jahreszahl) Then Exit Function
    
'// Neujahr setzen (fester Feiertag am 1. Januar)  
    m_uDTF.Neujahr = DateSerial(Jahreszahl, 1, 1)
    If mdatum = m_uDTF.Neujahr Then mbol = 1: FeiertagsName = "Neujahr"  
   
'// Hl. Drei Könige setzen (fester Feiertag am 6. Januar)  
    m_uDTF.DreiKoenige = DateSerial(Jahreszahl, 1, 6)
    If mdatum = m_uDTF.DreiKoenige Then mbol = 1: FeiertagsName = "Hl. Drei Koenige"  
 
'// Rosenmontag berechnen (beweglicher Feiertag; 48 Tage vor Ostern)  
'// m_uDTF.Rosenmontag = m_uDTF.Ostern - 48  
'// If mdatum = m_uDTF.Rosenmontag Then mbol = True: FeiertagsName = "Rosenmontag"  
 
'// Aschemittwoch berechnen (beweglicher Feiertag; 46 Tage vor Ostern)  
'// m_uDTF.Aschermittwoch = m_uDTF.Ostern - 46  
'// If mdatum = m_uDTF.Aschermittwoch Then mbol = True: FeiertagsName = "Aschermittwoch"  
 
'// Karfreitag berechnen (beweglicher Feiertag; 2 Tage vor Ostern)  
'// m_uDTF.Karfreitag = m_uDTF.Ostern - 2  
'// If mdatum = m_uDTF.Karfreitag Then mbol = True: FeiertagsName = "Karfreitag"  
 
'// Ostersonntag = m_uDTF.Ostern!  
    m_uDTF.Ostersonntag = m_uDTF.Ostern
    If mdatum = m_uDTF.Ostersonntag Then mbol = 1: FeiertagsName = "Ostersonntag"  
 
'// Ostermontag berechnen (beweglicher Feiertag; 1 Tag nach Ostern)  
    m_uDTF.Ostermontag = m_uDTF.Ostern + 1
    If mdatum = m_uDTF.Ostermontag Then mbol = 1: FeiertagsName = "Ostermontag"  
 
'// Maifeiertag setzen (fester Feiertag am 1. Mai)  
    m_uDTF.Maifeiertag = DateSerial(Jahreszahl, 5, 1)
    If mdatum = m_uDTF.Maifeiertag Then mbol = 1: FeiertagsName = "Staatsfeiertag"  
 
'// Christi Himmelfahrt berechnen (beweglicher Feiertag; 39 Tage nach Ostern)  
    m_uDTF.ChrHimmelfahrt = m_uDTF.Ostern + 39
    If mdatum = m_uDTF.ChrHimmelfahrt Then mbol = 1: FeiertagsName = "Chr. Himmelfahrt"  
 
'// Pfingstsonntag berechnen (beweglicher Feiertag; 49 Tage nach Ostern)  
    m_uDTF.Pfingstsonntag = m_uDTF.Ostern + 49
    If mdatum = m_uDTF.Pfingstsonntag Then mbol = 1: FeiertagsName = "Pfingstsonntag"  
 
'// Pfingstmontag berechnen (beweglicher Feiertag; 50 Tage nach Ostern)  
    m_uDTF.Pfingstmontag = m_uDTF.Ostern + 50
    If mdatum = m_uDTF.Pfingstmontag Then mbol = 1: FeiertagsName = "Pfingstmontag"  
 
'// Fronleichnam berechnen (beweglicher Feiertag; 60 Tage nach Ostern)  
    m_uDTF.Fronleichnam = m_uDTF.Ostern + 60
    If mdatum = m_uDTF.Fronleichnam Then mbol = 1: FeiertagsName = "Fronleichnam"  
 
'// Mariä Himmelfahrt setzen (fester Feiertag am 15. August)  
    m_uDTF.MariaeHimmelfahrt = DateSerial(Jahreszahl, 8, 15)
    If mdatum = m_uDTF.MariaeHimmelfahrt Then mbol = 1: FeiertagsName = "Maria Himmelfahrt"  
 
'// Nationalfeiertag setzen (fester Feiertag am 26. Oktober)  
    m_uDTF.Nation = DateSerial(Jahreszahl, 10, 26)
    If mdatum = m_uDTF.Nation Then mbol = 1: FeiertagsName = "Nationalfeiertag"  
 
'// Reformationstag setzen (fester Feiertag am 31. Oktober)  
'// m_uDTF.Reformationstag = DateSerial(Jahreszahl, 10, 31)  
'// If mdatum = m_uDTF.Reformationstag Then mbol = True: FeiertagsTName = "Reformationstag"  
 
'// Allerheiligen setzen (fester Feiertag am 1. November)  
    m_uDTF.Allerheiligen = DateSerial(Jahreszahl, 11, 1)
    If mdatum = m_uDTF.Allerheiligen Then mbol = 1: FeiertagsName = "Allerheiligen"  
 
'// Heiligabend setzen (fester 'Feiertag' am 24. Dezember)  
'// m_uDTF.Heiligabend = DateSerial(Jahreszahl, 12, 24)  
'// If mdatum = m_uDTF.Heiligabend Then mbol = 1: FeiertagsName = "Heiligabend"  
 
'// Erster Weihnachtstag setzen (fester 'Feiertag' am 25. Dezember)  
    m_uDTF.Weihnachten1 = DateSerial(Jahreszahl, 12, 25)
    If mdatum = m_uDTF.Weihnachten1 Then mbol = 1: FeiertagsName = "Christtag"  
 
'// Zweiter Weihnachtstag setzen (fester 'Feiertag' am 26. Dezember)  
    m_uDTF.Weihnachten2 = DateSerial(Jahreszahl, 12, 26)
    If mdatum = m_uDTF.Weihnachten2 Then mbol = 1: FeiertagsName = "Stefanitag"  
 
'// Sylvester setzen (fester 'Feiertag' am 31. Dezember)  
'// m_uDTF.Sylvester = DateSerial(Jahreszahl, 12, 31)  
'// If mdatum = m_uDTF.Sylvester Then mbol = True: FeiertagsName = "Silvester"  
 
   Feiertag = mbol
 
End Function
 
Function Ostern_berechnen(ByVal lYear As Long) As Boolean
 
'// Berechnung mit Hilfe des Algorithmus von Gauß  
    On Error GoTo Err_Ostern_berechnen
 
    Dim i1  As Integer
    Dim i2  As Integer
    Dim i3  As Integer
    Dim i4  As Integer
    Dim i5  As Integer
    Dim iTZ As Integer                            '// iTZ = Tageszahl  
 
    i1 = lYear Mod 19                             '// Formel nach Gauß  
    i2 = lYear Mod 4                              '// Werte für die Jahre  
    i3 = lYear Mod 7                              '// 1900 - 2099  
 
    i4 = (19 * i1 + 24) Mod 30
    i5 = (2 * i2 + 4 * i3 + 6 * i4 + 5) Mod 7
    iTZ = 22 + i4 + i5                            '// Ermittelt den Tag  
    If iTZ > 31 Then                              '// März oder April  
        iTZ = iTZ - 31                            '// Wenn April, dann - 31 Tage  
        If iTZ = 26 Then iTZ = 19                 '// Wenn 26.4. dann 19.4.  
        If (iTZ = 25 And i4 = 28 And i1 > 10) Then iTZ = 18
        m_uDTF.Ostern = DateSerial(lYear, 4, iTZ) '// Ostern im April  
    Else
        m_uDTF.Ostern = DateSerial(lYear, 3, iTZ) '// Ostern im Maerz  
    End If
    Ostern_berechnen = True
 
Exit_Ostern_berechnen:
    Exit Function
 
Err_Ostern_berechnen:
    Ostern_berechnen = False
    GoTo Exit_Ostern_berechnen
 
End Function


Function Werktagbestimmung(Wahl As Integer, Monat As Integer) As Variant
'Parameter Wahl ' 1 = erster Arbeitstag; 2 = fünfter Arbeitstag; 3 = erster Werktag; 4 = fünfter Werktag  
'Parameter Monat ' Übergabe der aktuellen Monatszahl  
'Um ersten AT im Monat aufzurufen: Werktagbestimmung(1,Monat(Heute))  

Dim wd As Integer
Dim DatumBestimmt As Date
Dim Tageszaehler As Integer
Dim Schleifenzaehler As Integer
Dim DateFound As Boolean
Dim DateCount As Integer

Dim x As Integer
Dim y As Integer

DateFound = False
DateCount = 0

If Wahl < 3 Then 'Ersten Arbeitstag im Monat ermitteln (Mo bis Fr)  
DateFound = False
Do While DateFound = False
DateCount = DateCount + 1
If Feiertag(DateSerial(Year(Now()), Monat, DateCount), "") = False Then  
    wd = Weekday(DateSerial(Year(Now()), Monat, DateCount), vbMonday)
    If wd < 6 Then
        DatumBestimmt = DateSerial(Year(Now()), Monat, DateCount)
        DateFound = True
    End If
End If
Loop
If Wahl = 2 Then 'Fünften Arbeitstag im Monat ermitteln (Mo bis Fr)  
    DateCount = 0
    Tageszaehler = 1
    Do While Tageszaehler <> 6
        DateCount = DateCount + 1
        'If Feiertag(DatumBestimmt + DateCount, "") = False Then  
        If Feiertag(DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount), "") = False Then  
            If Weekday(DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount), vbMonday) < 6 Then Tageszaehler = Tageszaehler + 1
        End If
    Loop
    DatumBestimmt = DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount)
End If 'Ende Ermittlung des fünften Arbeitstages (Mo bis Fr)  
End If 'Ende Ermittlung des ersten Arbeitstages (Mo bis Fr)  


If Wahl > 2 Then 'Ersten Werktag im Monat ermitteln (Mo bis Sa)  
DateFound = False
DateCount = 0
Do While DateFound = False
DateCount = DateCount + 1
If Feiertag(DateSerial(Year(Now()), Monat, DateCount), "") = False Then  
    wd = Weekday(DateSerial(Year(Now()), Monat, DateCount), vbMonday)
    If wd < 7 Then
        DatumBestimmt = DateSerial(Year(Now()), Monat, DateCount)
        DateFound = True
    End If
End If
Loop
If Wahl = 4 Then 'Fünften Werktag im Monat ermitteln (Mo bis Sa)  
    DateCount = 0
    Tageszaehler = 1
    Do While Tageszaehler <> 6
        DateCount = DateCount + 1
        If Feiertag(DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount), "") = False Then  
            If Weekday(DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount), vbMonday) < 7 Then Tageszaehler = Tageszaehler + 1
            wd = Weekday(DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount), vbMonday)
            x = y
        End If
    Loop
    DatumBestimmt = DateSerial(Year(DatumBestimmt), Month(DatumBestimmt), DateCount)
End If 'Ende Ermittlung des fünften Werktages (Mo bis Sa)  
End If 'Ende Ermittlung des ersten Werktages (Mo bis Sa)  


Werktagbestimmung = DatumBestimmt

End Function

Sub Test()
Dim Anzeige1 As Variant
Dim Anzeige2 As Variant
Anzeige1 = Werktagbestimmung(3, 12)
Anzeige2 = Werktagbestimmung(4, 12)
MsgBox "Der Wert lautet: " & Anzeige1 & " ##  " & Anzeige2, vbOKOnly, "Titel"  

End Sub


Trotzdem danke für eure Hilfe!

Gruß

Dr.