2015-11-05 115 views
0

我有一個ActiveX組合框,當用戶在組合框中輸入字符時,會有一個下拉列表填充和過濾。下拉項目從cLst。因此,下拉菜單將打開,但只要用戶點擊向下箭頭,組合框就會填充第一個下拉菜單項,並且下拉菜單中的所有其他項目都會消失,因爲它會嘗試過濾下拉菜單中的項目組合框,與下拉菜單中的一個項目完全匹配(箭頭向下突出顯示的項目)。從自動填充組合框停止下拉選擇組合框

在向下箭頭的下拉菜單中,如何避免此自動填充行爲,並讓用戶在他們想要填充組合框的選項上點擊輸入?

如果用戶避免使用鍵盤,鼠標可以正常滾動並突出顯示,然後單擊,並且僅在單擊時填充組合框。我希望滾輪能夠在可能的情況下滾動瀏覽下拉菜單。

Private Sub newCmb_Change() 
    filterComboList Tool.newCmb, cLst 
End Sub 

Private Sub newCmb_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
    Tool.newCmb.DropDown 
End Sub 

Private Sub newCmb_GotFocus() 'or _MouseDown() 
    Tool.newCmb.DropDown 
End Sub 

Public Sub filterComboList(ByRef cmb As ComboBox, ByRef dLst As Variant) 
    Dim itm As Variant, lst As String, sel As String, rng As Range 
    With Worksheets("Database") 
    Set rng = Application.Intersect(.UsedRange.Rows(2), .Cells.Resize(.Columns.Count - 1).Offset(1)) 
    End With 

    Application.EnableEvents = False 
    With cmb 
     sel = .Value 
     If IsEmpty(cLst) Then cLst = rng 
     For Each itm In cLst 
      If Len(itm) > 1 Then If InStr(1, itm, sel, 1) Then lst = lst & itm & "||" 
     Next 
     If Len(lst) > 1 Then .List = Split(Left(lst, Len(lst) - 2), "||") Else .List = dLst 
    End With 
    Application.EnableEvents = True 

End Sub 

回答

0

我正在處理同樣的問題,並最終找到在微軟幫助站點線程讓我打它周圍的一些信息。 I posted an answer here這似乎爲我工作。這是我在同一個概念的表格中使用的簡化版本。

基本思路是在組合框所在的工作表中觸發newCmb_KeyDown()事件(儘管應該與總體行爲中的KeyPress類似),該事件觸發箭頭鍵按下並設置標誌。通過將KeyCode值設置爲0並將newCmb.ListIndex值更改爲+/- 1以更改選擇並使用newCmb_Change()事件中的標誌,可以取消鍵的操作,因此可以防止ComboBox更改鏈接單元格值上下箭頭。一旦到達KeyDownKeyPress事件的結尾,您可以重置標誌,以便在發生更改時進行更改。

希望那些幫助,在我找到的線程中有一個鏈接,它有一些一般的想法(儘管專注於用戶窗體而不是電子表格)。祝你好運!

**編輯 注意:代碼的這些部分似乎是在我的工作表中控制此行爲的,但如果您在使用該工具時遇到問題,我可以再看一遍。