Home > 即効テクニック > Excel VBA > ユーザーフォーム関連のテクニック > コンボボックスでリスト以外の値を入力できないようにする

即効テクニック

ユーザーフォーム関連のテクニック

コンボボックスでリスト以外の値を入力できないようにする

(Excel 97)
コンボボックスのプロパティ「MatchRequired」を使うと、リストにない値は入力できないように制御されます。
しかし、このプロパティを設定してしまうと、リスト以外の値が入力された時のエラーメッセージの制御がVBAで不可能になってしまいます。
Excelからのエラーメッセージは「プロパティの値が不正です」という内容なので、もう少し親切な独自のメッセージを表示する場合は、プロパティ「MatchRequired」を使わずに、リスト項目中にない項目を選択すると値「-1」を返すListIndexプロパティを利用する方法があります。
サンプルマクロを実行するには、フォームにコンボボックス「ComboBox1」とテキストボックスを配置してください。
Dim blnError As Boolean

Private Sub UserForm_Initialize()
    ComboBox1.RowSource = "a1:a5"
End Sub

Private Sub ComboBox1_Click()
    SendKeys "{TAB}"
End Sub

Private Sub ComboBox1_Exit(ByVal Cancel As MSForms.ReturnBoolean)
    If blnError Then Cancel = True
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
                              ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then
        blnError = False
        If ComboBox1.Value <> "" Then
            If ComboBox1.ListIndex = -1 Then
                MsgBox "Error!"
                blnError = True
              Else
                MsgBox "OK!"
                SendKeys "{TAB}"
            End If
        End If
      ElseIf KeyCode = vbKeyTab Then
        blnError = False
        If ComboBox1.Value <> "" Then
            If ComboBox1.ListIndex = -1 Then
                MsgBox "Error!"
                blnError = True
              Else
                MsgBox "OK!"
            End If
        End If
    End If
End Sub
ListIndexプロパティは、リストの中で現在選択されている行のインデックスを示します。
ListIndexプロパティの値の範囲は-1以上で、リスト内の全行数から1を引いた数(ListCountプロパティ-1)以下です。どの行も選択されていない場合、ListIndexプロパティは「-1」を返します。リストボックスまたはコンボ ボックスでいずれかの行を選択すると、そのインデックス番号がListIndexプロパティに設定されます。
たとえば、リストの1行目を選択すると、ListIndexプロパティには0が設定され、2行目を選択すると1が設定されます。