コンボボックス

Last-modified: 2024-02-17 (土) 15:30:21

コンボ ボックスの内容をドロップダウン表示するには

[Alt] + [↓]

ComboBox.Dropdown メソッド

既定の動作のため、実装は不要です。

リストの幅を設定するには

→リスト幅/ListWidth

リストの列の幅を設定するには

→列幅/ColumnWidths
列幅はセミコロンで区切って指定します。
1cm;2cm
特定の列を非表示にするには、0cmを指定します。

値集合ソース以外の値を入力できないようにするには

  • 非連結の場合
  • 値集合ソース:(任意の値)
  • 値集合タイプ:値リスト
  • 既定値:(任意の値)

入力を制限する方法

  • 値リストの編集の許可:いいえ
  • IME 入力モード:使用不可
    Private Sub コンボ1_BeforeUpdate(Cancel As Integer)
    
        '値集合ソース以外の値を無効化する。
        'KeyDown, KeyPress で制御できない、「検索と置換」ダイアログ(Ctrl+H)による変更を無効化する。
        Dim strRowSource() As String
    
        strRowSource = Split(コンボ1.RowSource, ";")
    
        Dim varValue As Variant
        For Each varValue In strRowSource
            If コンボ1.Value = varValue Then
                Exit Sub
    
            End If
    
        Next
    
        Cancel = True
    
    End Sub
    
    Private Sub コンボ1_KeyDown(KeyCode As Integer, Shift As Integer)
    
        '編集関連の入力を無効化する。
        Select Case Shift
        Case 0
            Select Case KeyCode
            Case KeyCodeConstants.vbKeyDelete
                '削除の無効化
                KeyCode = 0
    
            End Select
    
        Case Shift And acCtrlMask
            Select Case KeyCode
            Case vbKeyV, vbKeyX
                '貼り付け、切り取りの無効化
                KeyCode = 0
    
            End Select
    
        End Select
    
    End Sub
    
    Private Sub コンボ1_KeyPress(KeyAscii As Integer)
    
        '値集合ソースの値の時、値を変更する。
        'それ以外は、値の入力を無効化する。
        Dim strRowSource() As String
    
        strRowSource = Split(コンボ1.RowSource, ";")
    
        Dim varValue As Variant
        For Each varValue In strRowSource
            If KeyAscii = Asc(varValue) Then
                コンボ1.Value = varValue
                Exit Sub
    
            End If
    
        Next
    
        KeyAscii = 0
    
    End Sub

New

データタブの入力チェック/LimitToList をはいに設定する。

  • 警告メッセージが表示されるようになります。
  • リスト外入力時/NotInList イベントが発生するようになります。
Private Sub コンボ1_NotInList(NewData As String, Response As Integer)
    '入力値を元に戻します。
    コンボ1.Undo

    '警告メッセージを無効にします。
    Response = acDataErrContinue

End Sub

参考

ComboBox.LimitToList プロパティ (Access) | Microsoft Docs
ComboBox.NotInList イベント (Access) | Microsoft Docs

Old

変更時/Change イベントで、選択された値を退避しておき、リストが選択されていない時(=任意の値が入力された時)は、退避した値に戻します。

 Private strコンボ As String

 Private Sub cmbコンボ_Change()
     If cmbコンボ.ListIndex = -1 Then
         'リストが選択されていない時
         cmbコンボ.Text= strコンボ

     End If

     strコンボ = cmbコンボ.Text

 End Sub

上下キーで項目を選択できるようにするには

Private Sub コンボ1_KeyDown(KeyCode As Integer, Shift As Integer)
    Select Case KeyCode
    Case vbKeyUp
        If Shift = 0 Then
            If 0 < コンボ1.ListIndex Then
                '↑キーが押された時、一つ上の項目を選択する
                コンボ1.ListIndex = コンボ1.ListIndex - 1

            End If

            KeyCode = 0

        End If

    Case vbKeyDown
        If Shift = 0 Then
            If コンボ1.ListIndex < コンボ1.ListCount - 1 Then
                '↓キーが押された時、一つ下の項目を選択する
                コンボ1.ListIndex = コンボ1.ListIndex + 1

            End If

        End If

        KeyCode = 0

    End Select

End Sub

入力した値がリストの値に含まれるかを判定するには

IsNull(コンボ1.Column(0))