• 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様解決しました。大変ありがとうございました。これで作業が進みます。
    りんご様お気遣いありがとうございました。