Excel组合框刷新下拉列表?

时间:2015-07-27 18:17:59

标签: excel vba combobox

有没有办法刷新组合框? 我有以下VBA代码。将填充下拉列表,直到清除列表并使用匹配项填充列表的If语句。

此时,下拉列表仅显示带滚动条的单个项目。但如果我关闭下拉并重新打开,它就会完全正确填充。

Private Sub ComboBox_SiteName_Change()
ComboBox_SiteName.DropDown

Dim v As Variant, i As Long
With Me.ComboBox_SiteName
 .Value = UCase(.Value)
 If .Value <> "" And .ListIndex = -1 Then
   v = Worksheets("Address").Range("Table5[[#All],[SITE NAME]]").Value
   .Clear ' Clear all items
   ' Repopulate with matched items
   For i = LBound(v, 1) To UBound(v, 1)
     If LCase(v(i, 1)) Like "*" & LCase(.Value) & "*" Then
      .AddItem v(i, 1)
     End If
   Next i
  Else
  ' Repopulate with all items
  .List = Worksheets("Address").Range("Table5[[#All],[SITE NAME]]").Value
  End If
 End With
End Sub

ComboBox_Change函数在用户在组合框中键入时被调用..在Clear和Repopulate匹配项之后,下拉框从列表变为单行,其中有向上/向下箭头。 但如果我关闭下拉部分并重新打开它,则列出所有没有向上/向下箭头的项目。 顺便提一下.ListRows值= 8。

我想要一种方法让下拉药水关闭并重新打开..或者VBA功能刷新下拉部分,没有外部按钮或控件请

3 个答案:

答案 0 :(得分:2)

将列表显示为仅显示与用户目前键入的文本匹配的值,这是一场噩梦。以下是我写的作品(但花了我一段时间!)

请注意,组合框的MacthEntry属性必须设置为“2 - frmMatchEntryNone”才能使代码生效。 (其他值导致组合框.value属性存储与用户键入的内容匹配的第一个值的文本,代码依赖于它存储键入的内容。)

另请注意,解决您观察到的行为的技巧,即组合框列表的值不正确,是使用代码行:

LastActiveCell.Activate
ComboBox_SiteName.Activate

此外,代码将获取列表中任何具有用户ANYWHERE在其文本中键入的字母的项目。

无论如何,这是我的代码:

Private Sub ComboBox_SiteName_GotFocus()

    ' When it first gets the focus ALWAYS refresh the list
    ' taking into acocunt what has been typed so far by the user
    RePopulateList FilterString:=Me.ComboBox_SiteName.Value

    Me.ComboBox_SiteName.DropDown

End Sub

' #4 Private Sub ComboBox_SiteName_Change()
Private Sub ComboBox_SiteName_Enter()

    Dim LastActiveCell As Range

    On Error GoTo err_Handler

    Set LastActiveCell = ActiveCell

    Application.ScreenUpdating = False

    With Me.ComboBox_SiteName

        If .Value = "" Then
            ' Used cleared the combo
            ' Repopulate will all values
            RePopulateList

            .DropDown

        Else

            ' #4 reducdant
            ' LastActiveCell.Select
            ' .Activate

            ' ===========================================
            ' #4 new code
            ' CheckBox1 is another control on the form
            ' which can receive the focus and loose it without event firing
            CheckBox1.SetFocus

            ' This will trigger the GotFocus event handler
            ' which will do a refresnh of the list
            .SetFocus
            ' ===========================================


        End If

    End With

    Application.ScreenUpdating = True

Exit Sub
err_Handler:
     Application.ScreenUpdating = True
     Err.Raise Err.Number, "", Err.Description
     Exit Sub
     Resume

End Sub


Private Sub RePopulateList(Optional FilterString As String = "")

    Dim i As Long
    Dim ValidValues() As Variant

    ' #2 range now refers to just the data cells
    ValidValues = Worksheets("Address").Range("Table5[SITE NAME]").Value

    With Me.ComboBox_SiteName

        If FilterString = "" Then

            ' All all values
            .List = ValidValues

        Else

            ' #2: .List cannot be set to have no items.
            ' so remove all but one
            .List = Array("Dummy Value")

            ' Only add values that match the FilterString parameter
            For i = LBound(ValidValues, 1) To UBound(ValidValues, 1)

                If LCase(ValidValues(i, 1)) Like "*" & LCase(FilterString) & "*" Then
                  .AddItem ValidValues(i, 1)
                End If

            Next i

           ' #2 add this line to remove the dummy item
           .RemoveItem (0)

        End If

    End With



End Sub

Private Sub ComboBox_SiteName_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Application.ScreenUpdating = False
End Sub

=============================================== =======================

您可以:将所有代码替换为可提供可接受功能的代码(只要数据源采用alpha顺序),这很简单!但是,它并不能完全符合您的要求。

Private Sub ComboBox_SiteName_GotFocus()

    With Me.ComboBox_SiteName
         .List = Worksheets("Address").Range("Table5[[#All],[SITE NAME]]").Value
    End With

    ComboBox_SiteName.DropDown

End Sub

组合框可以设置为“按用户类型过滤” - 只要数据按字母顺序排列。

=============================================== =======================

请注意,在您的代码中,以下两行会导致ComboBox_SiteName_Change事件再次启动。我怀疑你需要添加断点并调试更多代码。

.Value = UCase(.Value) 
.Clear ' Clear all items

无论如何,我希望这是完成的工作。

如果我得到它,这将是我的第一笔赏金,所以如果您需要更多帮助,请告诉我。 (我认为这可能超过50分)

哈维

=============================================== =

第2部分:

回答你的评论问题:

(参见上面代码中的#2标签)

要引用表列的数据,不包括标题用法: =表5 [网站名称] (如果单击并拖动列中的数据单元格,则在输入公式时将自动生成此项)。 代码已根据情况进行了修改。

我使用excel 2013和2010,发现.Activate事件同时适用于两者。 请参阅#3进行细微更改。

请重新复制所有代码。

请注意,我介绍了使用Application.ScreenUpdating尝试并停止闪烁的代码,但它没有任何效果 - 我不知道为什么。我已经离开了代码,因此您可以根据需要进行进一步的实验。

注意新程序ComboBox_SiteName_KeyDown

=============================================== =

第3部分:

回答你的评论问题: 这是表格上的组合! - 所以将更改标记为上面的#4。

哈维

答案 1 :(得分:1)

解决了!

https://trumpexcel.com/excel-drop-down-list-with-search-suggestions/

您可以做一些修改后的链接:

组合框属性中的

“ ListFillRange”应该是最后一列(正在更改的列)。如果是用户窗体,则范围将在“ RowSource”下。

并添加以下代码:

Private Sub ComboBox1_Change()

Sheets("Where the data is").Range("B3") = Me.ComboBox1.Value

End Sub

答案 2 :(得分:-1)

尝试将命令从Change更改为DropButtonClick

只需点击下拉列表即可刷新列表