Ich programmiere ein Access Payment Gehalt DB, und die Gehälter sollten die 14 jeden Monat bezahlt werden. Wenn es ein Wochenende oder ein Feiertag ist, dann sollte es der 13., 12., 11. usw. sein (der letzte Arbeitstag vor dem 14.). Unsere Wochenenden sind Freitag und Samstag - Wochentag (dteDate, vbSunday)VBA, um Zahlungstag für Gehalt zu berechnen (Access DB)
Meine Herausforderung ist, dass ich nicht den richtigen Wert bekomme, wenn der VBA die Berechnung durchführt. Zuerst prüft es, ob es sich um ein Wochenende handelt, reduziert dann ein oder zwei Tage (hängt davon ab, ob es sich um einen Samstag oder Sonntag handelt) und sollte dann testen, ob es sich um einen Feiertag handelt ([tblHoliday]. [TblHoliday]). Wenn ja, dann reduziere es mit einem Tag - bis es kein Feiertag mehr ist. Dann sollte es testen, ob es ein Wochenende ist, wieder, wenn ja, reduzieren Sie die korrekte Anzahl von Tagen, und testen Sie dann, ob es wieder Urlaub ist. Wenn nicht, dann gebe das Datum zurück.
Ich verwende diese in dem Vergleich Database
Private Sub PeriodeEnd_Text_AfterUpdate()
Dim dtDate As Date
Dim testDate As Date
dtDate = dhLastDayInMonth(Me.PeriodeEnd_Text) + 14
testDate = LastWorkDay(dtDate)
Me.PaymentDay_Text = testDate
End Sub
Und habe diese in einem Modul
Function dhLastDayInMonth(Optional dtmDate As Date = 0) As Date
' Return the last day in the specified month.
If dtmDate = 0 Then
' Did the caller pass in a date? If not, use
' the current date.
dtmDate = Date
End If
dhLastDayInMonth = DateSerial(Year(dtmDate), _
Month(dtmDate) + 1, 0)
End Function
Public Function LastWorkDay(Dt As Date) As Date
Dim Searching As Boolean
Searching = True
Do While Searching
If Weekday(LastWorkDay, vbSunday) > 5 Then
'-- Weekend day, back up a day
LastWorkDay = LastWorkDay - 1
Else
If Weekday(LastWorkDay, vbSunday) > 5 Or _
Not IsNull(DLookup("[HolidayDate]", "tblHoliday", _
"[HolidayDate] = " & Format(LastWorkDay, "\#mm\/dd\/yyyy\#;;;\N\u\l\l"))) Then
'-- The above Format of LastWorkday works with US or UK dates!
LastWorkDay = LastWorkDay - 1
Else
'-- The search is over
Searching = False
End If
End If
Loop
End Function
Können Sie den Code angeben, den Sie verwenden? –
'Dt' ist der Parameter Ihrer 'LastWorkDay'-Funktion, aber Sie verwenden ihn nie. Sie müssen wahrscheinlich die Zeile 'LastWorkDay = Dt' am Anfang Ihrer Schleife einfügen oder so einstellen, dass' Dt' in der gesamten Funktion verwendet wird und am Ende 'LastWorkDay = Dt' gesetzt wird. – OpiesDad
Hallo, danke für die Hilfe, und ich habe es getestet, aber es schlägt fehl. Wenn der Tag an einem Wochenende endet und (in meinem Fall) der letzte Werktag vor dem Wochenende Donnerstag ist, und wenn das ein Feiertag ist, endet das gesamte Access-Programm in einer Sackgasse. Ich muss das Programm neu starten. Aber zum Glück funktionieren Daves Vorschläge unten. Wenn Sie leicht sehen können, warum mein Code nicht funktioniert, wäre es nett für meine Aufzeichnung. –