たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_フォームの操作その6_コンボボックスにデータを追加【NotInList】

リスト内に存在しないデータが入力された場合に、入力値を新規データとして登録する

イベント【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

フォームは追加モードで開いているため、ここでレコード「R0005」は、テーブル「商品一覧」に追加される

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

新規登録の結果...

▼処理結果▼

チョココロネが追加された


...…飽きてきた