2020.2.4

テキストボックスの書式に「日付」を設定した際の入力チェック(カレンダー表示有り、入力規則)

Accessはフォームやテーブルを簡単に作成できていいですが、既定の動作の縛りが強く、動作を変えたいといった場合は苦労することが多いです。

今回は、その中の一つであるテキストボックスの入力チェックの話で、日付を例に入力規則の設定の仕方について記します。

目次

  • テキストボックスで日付の設定
  • 入力チェックの実装
  • 実行結果
  • 参考リンク

テキストボックスで日付の設定

Accessで日付を入力させようとした場合、テキストボックスで対応することができます。

フォームに配置したテキストボックスのプロパティ「書式」に「日付(S/M/L)」を設定します。

日付の入力でカレンダーを使用したい場合は、プロパティ「日付選択カレンダーの表示」に「日付」を設定します。

この状態でフォームを開くと以下のように表示されます。

入力チェックの実装

入力された日付が正常かどうかチェックするためには、コントロールのプロパティ「入力規則」を設定します。

例えば、任意の入力項目で日付かどうか、また、未来日を入力させないようにするには、以下のような書き方となります。


Is Null Or (IsDate([txt日付])=True And <=Date())

コントロールの名前(txt日付)が必要だったり、そうでなかったりするので、慣れるのに時間がかかると思います。また、「IsDate() = True」のTrueは必要です。省略したら正常に判定してくれませんでした。

「Is Null」がない場合、テキストボックスになにかしらの文字を入力した後は必須項目になり、空の状態では抜け出せなくなります。

入力規則に違反した場合のメッセージは、プロパティ「エラーメッセージ」に設定しておきます。

これでOKかと思いきや、テキストボックスの書式に「日付(S/M/L)」を設定したことで、既定の入力チェックが実行されてしまうため、メッセージを統一したい場合はVBAでも対応が必要になります。

対応が必要なのはフォームエラー時の処理。


Private Sub Form_Error(DataErr As Integer, Response As Integer)
    'データ型不一致エラー
    If Me.ActiveControl Is Me.[txt日付] And DataErr = 2113 Then
        Response = acDataErrContinue
        MsgBox "正常な日付を入力してください。(未来日は入力できません)", vbInformation + vbOKOnly
    End If
End Sub

データ型不一致(今回の場合は日付ではない文字)の場合、DataErrにエラーコード「2113」がセットされていて、どこのコントロールでエラーが発生したかの特定に「Me.ActiveControl Is Me.[コントロール名」で判定しています。

実行結果

上記の内容を設定した後に実行してみると、結果は以下の通りとなります。(現在日が「2020/2/4」の場合)

  • 入力内容「」(空) ⇒ OK
  • 入力内容「aaaa/aa/aa」 ⇒ NG(フォームエラーのデータ型不一致)
  • 入力内容「2020/99/99」 ⇒ NG(フォームエラーのデータ型不一致)
  • 入力内容「2020/02/05」 ⇒ NG(テキストボックスの入力規則違反)
  • 入力内容「2020/02/04」 ⇒ OK

あり得ない日付に関しては、フォームエラーのデータ型不一致で引っかかるようなので、書式が未設定の場合は入力規則のIsDate()は必要ですが、「日付(S/M/L)」の場合は不要で、入力規則の内容を以下のようにしてしまってもいいかもしれません。


Is Null Or <=Date()

2箇所に入力チェックの処理が分散してしまうのが嫌であれば、Access既定の入力チェックは捨てて、登録ボタン押下時にすべてのコントロールの値を判定するような仕組みにしてしまうのがいいかと思います。

必須チェックを実装する場合はそうするしかないので、その方がシンプルかもしれませんね。

ただし、その場合はAccess標準のカレンダーは使えないので、カレンダーは諦めるか、手間ですが自分で作成するかしないといけません。

参考リンク

Access】関連記事