Form.BeforeUpdate イベント (Access)
BeforeUpdate イベントは、コントロールまたはレコードで変更されたデータが更新される直前に発生します。
構文
式。BeforeUpdate (Cancel)
expressionForm オブジェクトを表す変数です。
パラメーター
名前 | 必須 / オプション | データ型 | 説明 |
---|---|---|---|
Cancel | 必須 | 整数型 (Integer) | BeforeUpdate イベントが発生したかどうかは、設定によって決まります。 引数 Cancel を True (1) に設定すると、BeforeUpdate イベントが取り消されます。 |
注釈
"SetValue/値の代入" アクションが記述されたマクロまたは Visual Basic で、コントロールに含まれるデータを変更した場合は、このイベントは発生しません。 別のレコードに移動するか、レコードを保存したときに、フォームに対して BeforeUpdate イベントが発生します。
このイベントが発生したときにマクロまたはイベント プロシージャを実行するには、 BeforeUpdate プロパティをマクロの名前または [イベント プロシージャ] に設定します。
このイベントは、オプション グループに格納されているチェック ボックス、オプション ボタン、およびトグル ボタンには適用されません。 オプション グループに対してのみ適用されます。
BeforeUpdate イベントは、コントロールまたはレコードが更新されるときに発生します。 レコード内では、コントロールがフォーカスを失ったとき、またはユーザーが Enter キーまたは Tab キーを押すと、各コントロールの変更されたデータが更新されます。フォーカスがレコードから離れたとき、またはユーザーが [レコード] メニューの [レコードの保存] をクリックすると、レコード全体が更新され、データがデータベースに保存されます。
フォームのコントロールに新しいデータまたは変更されたデータを入力し、別のレコードに移動するか、[レコード] メニューの [レコードの保存] をクリックしてレコードを保存すると、フォームの AfterUpdate イベントは、コントロールの AfterUpdate イベントの直後に発生します。
別のレコードに移動すると、コントロールの Exit イベントと LostFocus イベントが発生し、その後に移動したレコードの Current イベントと、このレコードの最初のコントロールの Enter イベントと GotFocus イベントが発生します。 Exit マクロおよび LostFocus マクロまたはイベント プロシージャを実行せずに AfterUpdate マクロまたはイベント プロシージャを実行するには、[ レコード ] メニューの [ レコードの保存 ] をクリックしてレコードを保存します。
コントロールに対する BeforeUpdate マクロまたはイベント プロシージャは、コントロールのデータが変更された場合にのみ発生します。 このイベントは、演算コントロールの値が変更された場合には発生しません。 フォームに対する BeforeUpdate マクロまたはイベント プロシージャは、レコード (コントロール) のデータが変更された場合にのみ発生します。
フォームでは、 BeforeUpdate イベントを使って、別のレコードに移動する前にカレント レコードの更新を取り消すことができます。
コントロールに新しい値を入力しても、データを保存するまで、つまりレコードが更新されるまでは、 OldValue プロパティの値は変更されません。 更新を取り消すと、コントロールで変更したデータの値が OldValue プロパティの値に戻されます。
BeforeUpdate イベントは、特に次のような複雑な入力検査を行う場合、データの入力検査によく使われます。
- フォームの複数の値を対象とする入力検査
- 入力されたデータによって異なるエラー メッセージを表示する入力検査
- ユーザーが無視できる入力検査
- 他のフォームのコントロールへの参照や、ユーザー定義関数が含まれる入力検査
注:
[!メモ] 簡単な入力検査を行う場合、またはフィールドへの入力要求を行ったりフォーム上で複数のコントロールを検査するなどのより複雑な入力検査を行う場合には、各コントロールの " ValidationRule /入力規則" プロパティと、テーブルのフィールドやレコードの " ValidationRule /入力規則" および " Required /値要求" プロパティを使って入力検査を実行することができます。
イベントのプロシージャで BeforeUpdate イベントを発生したコントロールに含まれるデータを変更しようとすると、実行時エラーが発生します。
例
次の例では、BeforeUpdate イベント プロシージャを使用して、製品名が既にデータベースに入力されているかどうかを確認する方法を示します。 ユーザーが ProductName ボックスに製品名を入力すると、値は Products テーブルの ProductName フィールドと比較されます。 Products テーブルに一致する値がある場合、製品が既に入力されていることをユーザーに通知するメッセージが表示されます。
次の使用例の実行結果を確認するには、ProductName という名前のテキスト ボックスが配置された Products という名前のフォームに対し、次のイベント プロシージャを追加します。
Private Sub ProductName_BeforeUpdate(Cancel As Integer)
If(Not IsNull(DLookup("[ProductName]", _
"Products", "[ProductName] ='" _
& Me!ProductName & "'"))) Then
MsgBox "Product has already been entered in the database."
Cancel = True
Me!ProductName.Undo
End If
End Sub
以下の例は、帳票フォームでコントロールが空の場合、ユーザーが他のレコードに移動する際にメッセージを表示する方法を示します。
Private Sub Form_BeforeUpdate(Cancel As Integer)
Dim oContr As Control
For Each oContr In Me.Detail.Controls
If IsNull(oContr) = True Then
If MsgBox(oContr.Name & " is empty", vbOKCancel) = vbCancel Then
Cancel = True: oContr.SetFocus: Exit Sub
End If
End If
Next oContr
End Sub
次の例は、フォームの BeforeUpdate イベントを使用して、1 つのコントロールにデータが含まれている場合にそれとは別のコントロールへの値の入力を要求する方法を示します。
Private Sub Form_BeforeUpdate(Cancel As Integer)
If (IsNull(Me.FieldOne)) Or (Me.FieldOne.Value = "") Then
' No action required
Else
If (IsNull(Me.FieldTwo)) or (Me.FieldTwo.Value = "") Then
MsgBox "You must provide data for field 'FieldTwo', " & _
"if a value is entered in FieldOne", _
vbOKOnly, "Required Field"
Me.FieldTwo.SetFocus
Cancel = True
Exit Sub
End If
End If
End Sub
サポートとフィードバック
Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。