What VBA event allows to capture click value of ActiveX combobox?

北城以北 提交于 2021-02-11 15:28:24

问题


After choosing item from ActiveX combobox by mouse click I would like the combobox to be closed and the item to be chosen.

Here is an example.

I have tried TempCombo_Click event but it is fired AFTER the TempCombo_Change event. And when I select item by click, my search string passed to TempCombo_Change event is empty. So I need something to preserve item selection in TempCombo_Change event.

I use modification of VBA code taken from Autocomplete suggestion in Excel data validation list again

Here is VBA exact code I use to generate the above example.

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Dim xCombox As OLEObject
    Dim xStr As String
    Dim xWs As Worksheet
    Dim xArr
    Set xWs = Application.ActiveSheet
    On Error Resume Next
    Set xCombox = xWs.OLEObjects("TempCombo")
    With xCombox
        .ListFillRange = ""
        .LinkedCell = ""
        .Visible = False
    End With
    If Target.Validation.Type = 3 Then
        Target.Validation.InCellDropdown = False
        'Cancel = True
        xStr = Target.Validation.Formula1
        xStr = Right(xStr, Len(xStr) - 1)
        If xStr = "" Then Exit Sub
        With xCombox
            .Visible = True
            .Left = Target.Left
            .Top = Target.Top
            .Width = Target.Width + 5
            .Height = Target.Height + 5
            .ListFillRange = xStr
            If .ListFillRange = "" Then
                xArr = Split(xStr, Application.International(xlListSeparator))
                Me.TempCombo.List = xArr
            End If
            .LinkedCell = Target.Address
        End With
        xCombox.Activate
        Me.TempCombo.DropDown
    End If
End Sub

Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Select Case KeyCode
        Case 9 'tab
            Application.ActiveCell.Offset(0, 1).Activate
        Case 13 'enter
            Application.ActiveCell.Offset(1, 0).Activate
    End Select
End Sub

Private Sub TempCombo_Change()
If Me.TempCombo = "" Then Exit Sub
ActiveSheet.OLEObjects(1).ListFillRange = ""
ActiveSheet.OLEObjects("TempCombo").Object.Clear
ThisWorkbook.ActiveSheet.OLEObjects("TempCombo").Activate

With Me.TempCombo
    If Not .Visible Then Exit Sub
    .Visible = False 'to refresh the drop down
    .Visible = True
    .Activate

'Dump the range into a 2D array
        Dim Arr2D As Variant
        Arr2D = [RangeItems].Value

'Declare and resize the 1D array
        Dim Arr1D As Variant
        ReDim Arr1D(1 To UBound(Arr2D, 1))

'Convert 2D to 1D
        Dim i As Integer
        For i = 1 To UBound(Arr2D, 1)
            Arr1D(i) = Arr2D(i, 1)
        Next

    Dim itm As Variant 'itm is for iterate purpose
    Dim ShortItemList() As Variant 'ShortItemList() is a variable which stores only filtered items
    i = -1
    For Each itm In Arr1D
        If InStr(1, itm, .Value, vbTextCompare) > 0 Or .Value = "" Then
            Debug.Print itm
             i = i + 1
             ReDim Preserve ShortItemList(i)
             ShortItemList(i) = itm
        End If
    Next itm
    .DropDown
End With

On Error Resume Next 'if we filter too much, there will be no items on ShortItemList
ThisWorkbook.ActiveSheet.OLEObjects("TempCombo").Object.List = ShortItemList

End Sub

回答1:


This line in the TempCombo_Click event solved the problem:

ActiveCell.Value = ThisWorkbook.ActiveSheet.OLEObjects("TempCombo").Object.Value


来源:https://stackoverflow.com/questions/54289930/what-vba-event-allows-to-capture-click-value-of-activex-combobox

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!