私はAccess Payment Salary DBをプログラミングしており、毎月14日に給与を支払う必要があります。週末、または休日の場合は、13日、12日、11日などでなければなりません(14日前の最後の就業日)。私たちの週末は金曜日と土曜日です - 平日(dteDate、vbSunday)給与の支払日を計算するVBA
私の挑戦は、VBAが計算を行うときに正しい値を得られないことです。まず、週末かどうかを確認し、土曜日か日曜日かによって1日か2日を減らし、休暇であるかどうかをテストします([tblHoliday]。[tblHoliday])。はいの場合は、それを1日で減らしてください。休日ではありません。それが週末かどうかをテストし、そうであれば正しい日数を減らし、休日かどうか再度テストします。そうでない場合は、日付を返します。私は比較データベース
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
とモジュール
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
使用しているコードを提供できますか? –
'Dt'はあなたの' LastWorkDay'関数のパラメータですが、決して使用しません。ループの始めに 'LastWorkDay = Dt'行を含めるか、関数全体で' Dt'を使うように設定し、最後に 'LastWorkDay = Dt'を設定する必要があります。 – OpiesDad
こんにちは、助けてくれてありがとう、私はそれをテストしましたが、失敗します。 1日が週末に終わり、週末の前の最後の就業日が木曜日であり、それが休日であれば、Accessプログラム全体がデッドロック状態になります。私はプログラムを再起動する必要があります。しかし、幸いなことに、Daveの提案は以下のとおりです。私のコードがなぜ機能していないのかを簡単に知ることができれば、私の記録にはうれしいでしょう。 –