リスト内に存在しないデータが入力された場合に、入力値を新規データとして登録する リストにないデータがコンボボックスに入力された際に発生するイベント ▼記述例▼ ▼記述例▼ ▼記述例▼ フォームは追加モードで開いているため、ここでレコード「R0005」は、テーブル「商品一覧」に追加される ▼記述例▼ ▼記述例▼ ▼処理結果▼
イベント【NotInList】とは
このイベントを使用して別フォームを開く
BeforeUpdateと組み合わせて、入力値によってはキャンセルできるようにするとよい
NotInListイベントはコンボボックスのプロパティにて「入力チェック」を「はい」にしておかないと発生しないので注意
今回の例では、以下のふたつのフォームを使用し、新商品名「チョココロネ」を登録コード「R0005」で登録する
▼1_コンボボックス設置フォーム▼
フォーム内のコンボボックスのリストには、別で作成したテーブル「商品一覧」をそのまま表示した「登録コード」「商品名」の2カラムがある
存在しない登録コードを入力すると新規登録するかどうかを聞くメッセージが出る
▼2_登録用フォーム▼
「登録コード」「商品名」の各入力窓と「閉じる」ボタンを設置、新規登録する登録コード「R0005」を元フォームから受け取る
いま現在空欄になっている「商品名」欄に、「チョココロネ」と入力して閉じるボタンを押すと、新規登録が完了するコンボボックス設置フォーム_NotInListイベントへの記述
Private Sub cmb1_NotInList(NewData As String, Response As Integer) '新しいフォームを開くかどうかで分岐
If MsgBox("入力値を登録しますか?",vbYesNo) = vbYes Then
DoCmd.OpenForm "登録用フォーム" , , , ,acFormAdd, acDialog, NewData '「acFormAdd」で新規追加、「OpenArgs」を使って入力値「R0005」を登録用フォームに渡す
End If
'以下、登録用フォームから戻った後の処理
If DCount("登録コード" , "商品一覧" , "登録コード = '" & NewData & "'") <> 0 Then 'テーブル「商品一覧」に「R0005」が追加されているか確認
Responce = acDataErrAdded '追加されていればコンボボックスに追加
Else
Responce = acDataErrContinue '追加されていなければコンボボックスに追加しない
Me.cmb1.Undo 'コンボボックスの値をリセット
End If
End Sub
登録用フォーム
Openイベントへの記述
Private Sub Form_Open(Cancel As Integer) 'そもそも受け取った値がNullだったらOpenすること自体キャンセル
If IsNull(Me.OpenArgs) Then
Cancel = True
End If
End Sub
Loadイベントへの記述
Private Sub Form_Load() '登録コードに値「R0005」を代入しつつ、頭文字は大文字で統一表示
Me.登録コード.Value = StrConv(Me.OpenArgs, vbUpperCase)
End Sub
BeforeUpdateイベントへの記述
Private Sub Form_BeforeUpdate(Cancel As Integer) '商品名がNullだったら更新はキャンセル、そうでなければレコードは更新される
If IsNull(Me.商品名.Value) Then
Cancel = True
End If
End Sub
設置ボタンへの記述
Private Sub btn1_Click() 'フォーム内に設置した「閉じる」ボタンをクリックでフォームを閉じる
DoCmd.Close acForm, Me.Name
End Sub
新規登録の結果...
チョココロネが追加された
...…飽きてきた