Microsoft Access 掲示板

車庫証明申請の場合の受付日について

6 コメント
views
4 フォロー

いつもお世話になっております。
先般申請日から許可日を求める式をご教示いただきました。大変ありがとうございました。
ついては今回は逆に申請日から受付日を求める式をご教示ください。
たとえば10月15日を申請日として10月11日(受付日)を自動的に求めたいのですが。
ご教示よろしくお願いします。

Public Function 許可日(申請日 As Variant, Optional 営業日数 As Long = 3) As Variant
    Dim 営業日 As Long
    許可日 = 申請日
    If IsNull(許可日) Then Exit Function
    Do
        許可日 = 許可日 + 1
        Select Case Weekday(許可日)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                営業日 = 営業日 + 1
            End If
        End Select
    Loop Until 営業日 = 営業日数 - 1
End Function

tokinaito
作成: 2024/10/12 (土) 13:11:03
通報 ...
1

祝日を含めての許可日について の関連質問でしょうか

結論から申し上げると、関数の第二引数に負の数を指定できるようにロジックを変更すればいいでしょう
 

Public Function 許可日(申請日 As Variant, Optional 営業日数 As Long = 3) As Variant
    Dim 営業日 As Long
    Dim 増量   As Long
    許可日 = 申請日
    If IsNull(許可日) Or Abs(営業日数) <= 1 Then Exit Function
    
    増量 = IIf(営業日数 > 0, 1, -1)
    Do
        許可日 = 許可日 + 増量
        Select Case Weekday(許可日)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                営業日 = 営業日 + 増量
            End If
        End Select
    Loop Until 営業日 = 営業日数 - 増量
End Function

 

Sub test()
    '呼び出し例
    Debug.Print "許可日から申請日を求める -> " & 許可日(#10/15/2024#, -2)
    Debug.Print "申請日から許可日を求める -> " & 許可日(#10/11/2024#, 2)
End Sub
2
りんご 2024/10/12 (土) 15:25:49 935bc@0e907

逆に申請日から受付日を求める式をご教示ください。
 架空請求や不正請求の辻褄合わせくらいしか思いつかないのですが、車庫申請業務では申請日から受付日を求める業務が一般的なのかしら?

3
tokinaito 2024/10/13 (日) 13:58:20 cb328@236a9

説明不足で申し訳ありません。実は申請日を受付日の翌日にするよう業務処理の変更(当日急いですれば間違いの発生
の恐れがあり、その防止のため)がありましたので
下記の式により処理したいと思っています。
申請日TXTは Date()により
出来日は下記式により
Public Function 許可日(申請日 As Variant, Optional 営業日数 As Long = 3) As Variant
    Dim 営業日 As Long
    許可日 = 申請日
    If IsNull(許可日) Then Exit Function
    Do
        許可日 = 許可日 + 1
        Select Case Weekday(許可日)
        Case vbMonday To vbFriday
            If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 許可日 & "#")) Then
                営業日 = 営業日 + 1
            End If
        End Select
    Loop Until 営業日 = 営業日数 - 1
End Function
そして受付日をVBAにて処理し
下記式によりF車庫証明にうつり処理したいと思っています。

DoCmd.OpenForm "F車庫証明"
If IsNull(Me.至ID) Then
Else
Forms!F車庫証明.SetFocus 'F車庫証明をアクティブにする(念の為)
For Sx = 1 To Me.至ID
DoCmd.GoToRecord acActiveDataObject, , acNewRec
Forms!F車庫証明![ 受付日] = Me.[ 受付日TXT]
Forms!F車庫証明![申請日] = [申請日TXT]
'Forms!F車庫証明![出来上日] = [出来日TXT]
DoCmd.RunCommand acCmdSaveRecord
Next Sx
よろしくご教示願います。

4
  • 申請日から許可日(未来)を求める場合、営業日数は申請日を含んでカウントする
  • 申請日から受付日(過去)を求める場合、営業日数は申請日を含まずにカウントする
  • 許可日は申請日の2営業日後または3営業日後の日付になる
  • 受付日は申請日の1営業日前の日付になる

という解釈で合ってますか

 

Public Function 受付日(申請日 As Variant, Optional 営業日数 As Long = 1) As Variant
    Dim 営業日 As Long
    受付日 = 申請日
    If IsNull(受付日) Or 営業日数 = 0 Then Exit Function
    
    While 営業日 < Abs(営業日数)
        受付日 = 受付日 - 1
        Select Case Weekday(受付日)
            Case vbMonday To vbFriday
                If IsNull(DLookup("祝日名", "T_祝日", "日付=#" & 受付日 & "#")) Then
                    営業日 = 営業日 + 1
                End If
        End Select
    Wend
End Function

 
あとは F車庫証明フォームを開く前に、カレントフォームの適切なイベントで
受付日TXTへ 受付日関数の結果を代入すればいいでしょう

申請日TXTは Date()により

ということでしたら、以下3つの記述はいずれも同じ結果になります

Me.受付日TXT.Value = 受付日(Date)
'或いは
Me.受付日TXT.Value = 受付日(Date, 1)
'或いは
Me.受付日TXT.Value = 受付日(Me.申請日TXT.Value)
5
りんご 2024/10/13 (日) 15:16:11 935bc@0e907

>当日急いですれば間違いの発生の恐れがあり、その防止のため)がありましたので
 年間スケジュールを決め打ちすれば、無駄なコードを作って365日毎回走らせなくて済むんじゃ無いかしら。

6
tokinaito 2024/10/14 (月) 08:30:03 cb328@236a9

mayu様解決しました。大変ありがとうございました。これで作業が進みます。
りんご様お気遣いありがとうございました。