コンボボックスのプロパティ「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が設定されます。