日付の範囲を確認する(入力値確認 4)

2022年2月14日月曜日

VB.NET 日付操作

t f B! P L
前回までは文字列のバイト数の取得や数値の桁数の
確認を御紹介いたしました。

今回は日付に関する機能として、入力された値が日付として認識でき、
指定の範囲に当てはまるかの確認を御紹介いたします。

業務システムで使用するパターンとしては伝票入力時に日付や
入金・支払の予定日など日付を扱うケースも多く、
入力する際のチェックに利用できるかと思います。

ではサンプルを用いて御紹介します。
まず入力された文字列が日付として認識できるかどうかを確認するには
「IsDate」メソッドで確認できます。
日付に変換できれば「True」、できなければ「False」が返されます。

IsDate("2022/1/31")      '←True
IsDate("22/1/31")                    '←True
IsDate("2022/1/31")    '←False
IsDate("2022年1月31日")      '←True
IsDate("2022-1-31")      '←True
IsDate("令和4年1月31日")      '←True
IsDate("R4/1/31")                   '←True

ここで日付として認識できるかは確認可能です。
西暦・和暦などある程度の形式であれば日付として認識されます。
ただし、西暦2桁での年の指定は「22」は必ず2022年と認識されるとは限りません。
思わぬ不具合を防ぐために西暦は4桁で指定できるように
プログラミングするほうが経験上安全なように思います。

また和暦での登録も新しい元号になると
メンテナンスが必要になるケースも考えられますので、
最近は西暦での入力が採用されるケースが多いように思います。

また入力箇所をMaskedTextBoxを使用し、
入力される値やフォーマットを固定してしまうと
入力間違いも防止できるかと思います。

あとはシステムの仕様に合わせ指定の範囲内の日付かどうかを確認すれば
入力された数値が指定範囲内かの確認が可能です。

ではこれを関数にまとめてみましょう。
Private Function fncCheck(pstrText As String, _
                                      pdteMin As Date, _
                                      pdteMax As Date) As Integer

    Dim dteCheck As Date    '文字列を日付に変換した値

    '①日付かどうか確認
    If IsDate(pstrText) = False Then
        MsgBox("日付と認識できません。", vbOKOnly, "形式エラー")
        Return 1
    End If

    '②範囲を確認
    dteCheck = CDate(pstrText)

    If dteCheck pdteMin Then
        MsgBox("値が小さすぎます。", vbOKOnly, "範囲エラー")
        Return 2
    End If 

    If dteCheck > pdteMax Then
        MsgBox("値が大きすぎます。", vbOKOnly, "範囲エラー")
        Return 3
    End If 

    Return -1

End Function

引数 pstrText - 確認したい文字列
引数 pdteMin - 指定範囲最小値
引数 pdteMax - 指定範囲最大値
 
戻り値
確認したい文字列が日付として認識できない場合 1
指定範囲の最小値より日付が小さい場合 2
指定範囲の最大値より日付が大きい場合 3
指定範囲内の場合 -1

保存ボタンを押された場合など確認が必要なタイミングで入力された文字列と
日付の範囲を指定し関数を呼び出すと
範囲内かどうか確認することができます。
この戻り値を元にメッセージなどを表示したりなどの
処理を行なうことができるかと思います。
前回と同様に同じ処理をクラス化してみましょう。

Public Class CheckDate

    Public Property pstrText As String
    Public Property pdteMin As Date
    Public Property pdteMax As Date

    'メソッドの作成
    Public Function CheckDate() As Integer

        Dim dteCheck As Date        '文字列を日付に変換した値

        '①日付かどうか確認
        If IsDate(pstrText ) = False Then
            MsgBox("日付と認識できません。", vbOKOnly, "形式エラー")
            Return 1
        End If

        '②範囲を確認
        dteCheck CDate(pstrText )

        If dteCheck < pdteMin Then
            MsgBox("値が小さすぎます。", vbOKOnly, "範囲エラー")
            Return 2
        End If 

        If dteCheck > pdteMax Then
            MsgBox("値が大きすぎます。", vbOKOnly, "範囲エラー")
            Return 3
        End If 

        Return -1

    End Function
End Class

前回と同様に引数をプロパティに、
実際チェックを行なう処理をメソッドとして作成しておきます。
日付の範囲を確認する処理も文字数や数値の確認と同様に
様々なシステムで使用することができますので、
一つ作成しておくと便利かと思います。

他にもいろいろと方法もございますし、
開発するシステムによっては、よりふさわしい方法もあるかと思いますが、
御参考にしていただければと思います。
サンプルはVB.NETで作成しておりますが、
考え方はどんな言語でも同じですので、
参考にしていただければと思います。


QooQ