次の方法で共有


ComboBox.NotInList イベント (Access)

NotInList イベントは、コンボ ボックスで、リスト ボックス部分に含まれていない値をテキスト ボックス部分に入力したときに発生します。

構文

NotInList (NewDataResponse)

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

パラメーター

名前 必須 / オプション データ型 説明
NewData 必須 String Microsoft Access が、ユーザーがコンボ ボックスのテキスト ボックス部分に入力したテキストをイベント プロシージャに渡すために使用する文字列。
Response 必須 整数型 (Integer) この設定は、 NotInList イベントがどのように処理されたかを示します。 引数 Response には、次の組み込み定数のいずれかを使用します。
  • acDataErrDisplay (既定値) 既定のメッセージを表示します。 ユーザーがコンボ ボックスリストに新しい値を追加できないようにするには、これを使用します。
  • acDataErrContinue 既定のメッセージをユーザーに表示しません。 ユーザーにカスタム メッセージを表示する場合は、これを使用します。 たとえば、イベント プロシージャは、ユーザーが新しいエントリを保存するかどうかを確認するカスタム ダイアログ ボックスを表示できます。 応答が [はい] の場合、イベント プロシージャは新しいエントリをリストに追加し、 Response 引数を acDataErrAdded に設定します。 応答が No の場合、イベント プロシージャは Response 引数を acDataErrContinue に設定します。
  • acDataErrAdded メッセージは表示されませんが、 NotInList イベント プロシージャで、コンボ ボックス リストにエントリを追加できるようになります。 エントリが追加された後、Access はコンボ ボックスのクエリを再実行してリストを更新します。 次に、コンボ ボックス リストに対して文字列を再確認し、コンボ ボックスがバインドされているフィールドの NewData 引数に値を保存します。 文字列が一覧にない場合は、エラー メッセージが表示されます。

注釈

このイベントが発生したときにマクロまたはイベント プロシージャを実行するには、 OnNotInList プロパティをマクロの名前または [イベント プロシージャ] に設定します。

NotInList イベントを使うと、コンボ ボックスに新しい値を追加できるようになります。

NotInList イベントを発生させるには、LimitToList プロパティを Yes に設定する必要があります。

NotInList イベントは Error イベントをトリガーしません。

NotInList イベントは、"LimitToList/入力チェック" プロパティが [Yes/はい] に設定されているコンボ ボックスに対してリストにない値を入力し、他のコントロールに移動するか、またはレコードを保存した後で発生します。 また、コンボ ボックスに対するすべての Change イベントの後で発生します。

AutoExpand プロパティが [はい] に設定されている場合、ユーザーがコンボ ボックスのテキスト ボックス部分に文字を入力すると、リスト内の一致する値が選択されます。 ユーザーが入力した文字がリスト内の値の最初の文字と一致する場合 (たとえば、ユーザーの型が "Smith"、"Smithson" がリスト内の値)、ユーザーが別のコントロールに移動したり、レコードを保存したりしたときに NotInList イベントは発生しません。 ただし、Access の文字は、ユーザーが入力した文字 (例では "son") に追加され、コンボ ボックスのテキスト ボックス部分で選択されます。 ユーザーがこのような場合に NotInList イベントを発生させたい場合 (たとえば、ユーザーが新しい名前 "Smith" をコンボ ボックス リストに追加する場合)、ユーザーは新しい値の最後の文字の後に Space、Backspace、または Delete 文字を入力できます。

LimitToList プロパティが [はい] に設定され、コンボ ボックス リストがドロップダウンされると、AutoExpand プロパティが [いいえ] に設定されている場合でも、ユーザーがコンボ ボックスのテキスト ボックス部分に文字を入力すると、リスト内の一致する値が選択されます。 ユーザーが Enter キーを押すか、別のコントロールまたはレコードに移動すると、選択した値がコンボ ボックスに表示されます。 この場合、 NotInList イベントは発生しません。 コンボ ボックス リストをドロップダウンしないときは、NotInList イベントが発生します。

次の例では、NotInList イベントを使用してコンボ ボックスにアイテムを追加します。

この例を試すには、フォームに Colors というコンボ ボックスを作成します。 コンボ ボックスの "LimitToList/入力チェック" プロパティを [Yes/はい] に設定します。 コンボ ボックスにデータを入力するには、コンボ ボックスの "RowSourceType/値集合タイプ" プロパティに [Value List/値リスト] を設定し、"RowSource/値集合ソース" プロパティの設定として、セミコロンで区切られた値のリストを指定します。 たとえば、このプロパティの設定として次の値を指定できます。緑;青。

次に、フォームに以下のイベント プロシージャを追加します。 フォーム ビューに切り替えて、コンボ ボックスのテキスト ボックス部分に新しい値を入力します。

注:

[!メモ] この例では、連結されていないコンボ ボックスに項目を追加します。 連結されているコンボ ボックスに項目を追加するときは、基になるデータ ソース内のフィールドに値を追加します。 ほとんどの場合、新しいレコードに 1 つのフィールドを追加することはできません。テーブル内のデータ構造によっては、データ要件を満たすために 1 つ以上のフィールドを追加する必要があります。 たとえば、新しいレコードには、主キーを構成するすべてのフィールドの値を含める必要があります。 連結されたコンボ ボックスにアイテムを動的に追加する必要がある場合は、すべての必要なフィールドにデータを入力し、新しいレコードを保存して、新しい値を表示するコンボ ボックスの再クエリを実行するようにユーザーに要求する必要があります。

Private Sub Colors_NotInList(NewData As String, _ 
        Response As Integer) 
    Dim ctl As Control 
     
    ' Return Control object that points to combo box. 
    Set ctl = Me!Colors 
    ' Prompt user to verify they wish to add new value. 
    If MsgBox("Value is not in list. Add it?", _ 
         vbOKCancel) = vbOK Then 
        ' Set Response argument to indicate that data 
        ' is being added. 
        Response = acDataErrAdded 
        ' Add string in NewData argument to row source. 
        ctl.RowSource = ctl.RowSource & ";" & NewData 
    Else 
    ' If user chooses Cancel, suppress error message 
    ' and undo changes. 
        Response = acDataErrContinue 
        ctl.Undo 
    End If 
End Sub

次の例では、NotInList イベントを使用して、連結されているコンボ ボックスにアイテムを追加する方法を示します。

Private Sub cboDept_NotInList(NewData As String, Response As Integer)
    Dim oRS As DAO.Recordset, i As Integer, sMsg As String
    Dim oRSClone As DAO.Recordset

    Response = acDataErrContinue

    If MsgBox("Add dept?", vbYesNo) = vbYes Then
        Set oRS = CurrentDb.OpenRecordset("tblDepartments", dbOpenDynaset)
        oRS.AddNew
        oRS.Fields(1) = NewData
        For i = 2 To oRS.Fields.Count - 1
            sMsg = "What do you want for " & oRS(i).Name
            oRS(i).Value = InputBox(sMsg, , oRS(i).DefaultValue)
        Next i
        oRS.Update
        cboDept = Null
        cboDept.Requery
        DoCmd.OpenTable "tblDepartments", acViewNormal, acReadOnly
        DoCmd.GoToRecord acDataTable, "tblDepartments", acLast
    End If
End Sub

次の例では、連結されているコンボ ボックスにアイテムを追加する方法を示します。

Private Sub cboMainCategory_NotInList(NewData As String, Response As Integer)

    On Error GoTo Error_Handler
    Dim intAnswer As Integer
    intAnswer = MsgBox("""" & NewData & """ is not an approved category. " & vbcrlf _
        & "Do you want to add it now?" _ vbYesNo + vbQuestion, "Invalid Category")

    Select Case intAnswer
        Case vbYes
            DoCmd.SetWarnings False
            DoCmd.RunSQL "INSERT INTO tlkpCategoryNotInList (Category) "
                & _ "Select """ & NewData & """;"
            DoCmd.SetWarnings True
            Response = acDataErrAdded
        Case vbNo
            MsgBox "Please select an item from the list.", _
                vbExclamation + vbOKOnly, "Invalid Entry"
            Response = acDataErrContinue

    End Select

    Exit_Procedure:
        DoCmd.SetWarnings True
        Exit Sub

    Error_Handler:
        MsgBox Err.Number & ", " & Error Description
        Resume Exit_Procedure
        Resume

End Sub

サポートとフィードバック

Office VBA またはこの説明書に関するご質問やフィードバックがありますか? サポートの受け方およびフィードバックをお寄せいただく方法のガイダンスについては、Office VBA のサポートおよびフィードバックを参照してください。