フォーム上に日付の数があり、それぞれ個別に検証を開始しました。これらすべてのチェックを、それぞれの「更新前」イベントから呼び出すことができる1つの関数に置き換えることを望んでいました。問題は、検証に失敗したときにコントロールにフォーカスを置くことができないということです。Access VBA get CancelプロパティのSubにデータを渡す関数
Public Function CheckDate(datefield As TextBox) As Integer
Dim this_date As Date
Dim DOB As Date
Dim first_seen As Date
this_date = Conversion.CDate(datefield.text)
DOB = [Forms]![generic]![date_of_birth]
first_seen = [Forms]![generic]![date_first_seen]
If Not IsNull(this_date) Then
'date of birth must precede any other date
If this_date < DOB Then
MsgBox "This date precedes the date of birth", vbExclamation, "Invalid date"
CheckDate = -1
Exit Function
End If
'date can't be in the future
If this_date > DateTime.Date Then
MsgBox "This date is in the future", vbExclamation, "Invalid date"
CheckDate = -1
Exit Function
End If
'all investigation/treatment dates must be >= date first seen
If Not IsNull(first_seen) Then
If this_date < first_seen Then
MsgBox "This date precedes the date patient was first seen", vbExclamation, "Invalid date"
CheckDate = -1
Exit Function
End If
End If
End If
End Function
は
Private Sub xray_date_BeforeUpdate(Cancel As Integer)
内で私が試してみた:正しいメッセージが表示されなく移動し、編集のためにそこにそれを維持するのではなく、コントロールからのフォーカス
Call CheckDate(xray_date)
。
Cancel = CheckDate(xray_date)
は、無効なデータをストレージに引き渡すことはできません。では、検証が失敗したときにBeforeUpdateのCancelイベントをTrueに設定するには、どのように関数を呼び出す必要がありますか?
@Hansupは、関数の署名 'CheckDate(DateBox As TextBox) 'がTextBox以外のものを渡すことを不可能にしますか? –
@HansUp 'Cancel CheckDate(xray_date)' は、 'Call CheckDate(xray_date)'の処理中に何もしないように見えませんでした。 –
私はコントロールレベルでそれらの日付をチェックすべきではなく、フォームのBefereUpdateイベントを使用するだけでよいと思います。そこにはキャンセルオプションがあります。さらに、ユーザーがすべて保存しようとするまでは気にしません。ユーザーがコントロールを塗りつぶす順序を制御しないことを忘れないでください!彼はマウスのマスターです。 –