Function GetPeriod(sd, ed)
' 日付かどうか
If IsDate(sd) = False Or IsDate(ed) = False Then
GetPeriod = "9999"
Exit Function
End If
' 日付の差が妥当か
If CDate(sd) > CDate(ed) Then
GetPeriod = "9998"
Exit Function
End If
sn = DateToNumber(sd)
en = DateToNumber(ed) + 1
If Year(sd) = Year(ed) Then
' 年度の差がない場合
ElseIf Year(sd) + 1 = Year(ed) Then
en = en + 36 ' 年度の差が1年の場合+36
Else ' 年度の差が2年以上はエラー
GetPeriod = "9997"
Exit Function
End If
GetPeriod = en - sn
End Function
Function DateToNumber(target)
result = Month(target) * 3 - 2
Select Case Day(target)
Case 1 To 10
result = result + 0
Case 11 To 20
result = result + 1
Case Else ' 21~
result = result + 2
End Select
DateToNumber = result
End Function
Sub TestGetPeriod()
' 1-10 11-20 21-30
Debug.Print GetPeriod("a", "2023/12/4"), "9999"
Debug.Print GetPeriod("2023/12/5", "2023/12/4"), "9998"
Debug.Print GetPeriod("2023/12/5", "2023/12/5"), "1"
' 1の区間から2の区間
Debug.Print GetPeriod("2023/12/5", "2023/12/11"), "2"
Debug.Print GetPeriod("2023/12/5", "2023/12/19"), "2"
Debug.Print GetPeriod("2023/12/5", "2023/12/20"), "2"
Debug.Print GetPeriod("2023/12/5", "2023/12/21"), "3"
' 2の区間から3の区間
Debug.Print GetPeriod("2023/1/19", "2023/1/21"), "2"
Debug.Print GetPeriod("2023/1/20", "2023/1/22"), "2"
' 3の区間から
Debug.Print GetPeriod("2023/1/21", "2023/1/22"), "1"
Debug.Print GetPeriod("2023/1/31", "2023/2/1"), "2"
' 年度またぎ
Debug.Print GetPeriod("2023/9/25", "2024/1/10"), "11"
Debug.Print GetPeriod("2023/10/1", " 2024/3/31"), "18"
End Sub