首页 > 解决方案 > Combobox - 根据输入文本过滤列表

问题描述

我正在尝试修改以下代码以允许组合框根据您的输入自动过滤列表,类似于过滤器预览如何在过滤表列时缩小字段。

该代码应该在 A1:A791 范围内提取我希望包含在组合框下拉列表中的 790 个项目的列表。最初,当我定义一个静态数组时,过滤器工作如下:

Sub ComboBox1_Populate(Optional fltr As String)
ComboBox1.List = Filter(Array("qqq", "qqwww", "qqttt", "qwer"), fltr)     
End Sub

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal 
Shift As Integer)
Call ComboBox1_Populate(ComboBox1.Text)
End Sub

Private Sub UserForm_Initialize()
Call ComboBox1_Populate
End Sub

但是,当我尝试按如下方式过滤范围值时,我收到类型不匹配运行时错误 13,其中包含以下内容:

Sub ComboBox1_Populate(Optional fltr As String)
ComboBox1.List = Filter(Sheets("DVTest").Cells(2, 1).Resize(790, 10).Value, 
fltr)
End Sub

Private Sub ComboBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal 
Shift As Integer)
Call ComboBox1_Populate(ComboBox1.Text)
End Sub

Private Sub UserForm_Initialize()
Call ComboBox1_Populate
End Sub

我正在寻找有关如何根据指定范围在组合框列表中获得相同过滤功能的建议,而不是 4 个文本选项的静态数组。

谢谢您的帮助!

标签: excelvba

解决方案


根据Filter Function的文档,它sourcearray是一个一维的字符串数组。

  • 您清楚地指定了一个多维数组Resize(790, 10)
  • .Value返回一个变体数组,而不是字符串。

经审查,数组或变体是可以的,但它必须是一维的;所以你必须处理范围,因为即使是 1 列也会产生一个二维数组。这是我用来弥合差距的方法...

Function RangeToOneDemensionalArray(Target As Range) As Variant
Dim Cell As Range
Dim ResultArr
Dim i As Long

    If Target Is Nothing Then Exit Function
    ReDim ResultArr(Target.Count - 1) As String

    For Each Cell In Target
        ResultArr(i) = Cell.Value
        i = i + 1
    Next

    RangeToOneDemensionalArray = ResultArr
End Function

推荐阅读