次の方法で共有


Form.BeforeUpdate イベント (Access)

BeforeUpdate イベントは、コントロールまたはレコードで変更されたデータが更新される直前に発生します。

構文

BeforeUpdate (Cancel)

expressionForm オブジェクトを表す変数です。

パラメーター

名前 必須 / オプション データ型 説明
Cancel 必須 整数型 (Integer) BeforeUpdate イベントが発生したかどうかは、設定によって決まります。 引数 CancelTrue (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 のサポートおよびフィードバックを参照してください。