Excel ActiveX ComboBox onClick event

Deepak picture Deepak · Aug 3, 2012 · Viewed 8.4k times · Source

I am trying to use the ActiveX ComboBox in excel. Everything works fine to the point of being populated from the drop down button click_event. But when it set the click event I find it is triggered even from keystrokes like the Arrow keys. Is this normal behavior, and if so how can I bypass this?

I am working on Excel 2007 VBA

This is the method i used to allow navigating in the combo box using keys , i will wait to see if there is a better solution.. : lastkey is a public variable

Private Sub ComboBox1_KeyDown(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = 38 Then
        If ComboBox1.ListIndex <> 0 Then
            lastkey = KeyCode
            ComboBox1.ListIndex = ComboBox1.ListIndex - 1
            KeyCode = 0
        End If
    ElseIf KeyCode = 40 Then
        If ComboBox1.ListIndex <> ComboBox1.ListCount - 1 Then
            lastkey = KeyCode
            ComboBox1.ListIndex = ComboBox1.ListIndex + 1
            KeyCode = 0
        End If
    End If
End Sub

Private Sub ComboBox1_Click()
    If lastkey = 38 Or lastkey = 40 Then
        Exit Sub
    Else
        MsgBox "click"
    End If
End Sub

Answer

Siddharth Rout picture Siddharth Rout · Aug 3, 2012

Yes this is normal behavior. Using the arrow keys navigates the items in the combo and hence the click event is fired.

To bypass that insert this code. This captures all the 4 arrow keys and does nothing when it is pressed. The only drawback of this method is that you will not be able to navigate using the Arrow keys anymore.

Private Sub ComboBox1_KeyDown(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
    Case 37 To 40: KeyCode = 0
    End Select
End Sub

FOLLOWUP

Dim ArKeysPressed As Boolean

Private Sub ComboBox1_Click()
    If ArKeysPressed = False Then
        MsgBox "Arrow key was not pressed"
        '~~> Rest of Code
    Else
        ArKeysPressed = False
    End If
End Sub

Private Sub ComboBox1_KeyDown(ByVal KeyCode As _
MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
    Case 37 To 40: ArKeysPressed = True
    End Select
End Sub