【问题标题】:How to populate combobox values from textbox text in excel vba form如何从excel vba表单中的文本框文本填充组合框值
【发布时间】:2021-01-26 23:01:04
【问题描述】:

我在 Excel 中的 VBA 表单中有问题,我正在尝试使用 VLOOKUP 从我在文本框中键入的任何内容中过滤组合框的值。我如何做到这一点?

我的代码是:

Private Sub btnTemplateSearch_Click()
Dim filterInfo As Range
Set filterInfo = Worksheets("InfoDump").Range("E2:F46")
txtTemplateFilter.Text = filterInfo.Columns(2).Value

Me.cboTemplateType.List = Application.WorksheetFunction.VLookup(Me.txtTemplateFilter.Text, filterInfo,2,True)

【问题讨论】:

  • 您必须澄清您的要求。您想通过在文本框中输入值来过滤 combobox 中的值吗?或者您想使用文本框的值对工作表执行Vlookup?我认为您想做什么以及您的预期结果的示例可能会有所帮助。
  • 是的,很抱歉。我希望通过使用在文本框中键入的单词或单词的一部分来过滤组合框中的值。就像不是滚动浏览组合框中的条目一样,我只需键入 apple,组合框将填充我的工作表列中包含单词 apple 的所有项目。
  • ComboBox 无法过滤。在将其加载到 ComboBox 之前,您必须根据过滤器减少输入列表
  • 当我单击命令按钮时,它应该查找与文本框中的单词匹配的所有条目。这样,组合框将根据文本框文本值加载所有匹配信息

标签: excel vba combobox vlookup


【解决方案1】:

以下是可用于过滤ComboBox 条目列表的代码块示例。我决定在模块级别 Dim 一个数组变量 ListForComboBox 以便模块中的所有程序都可以访问它。它通过调用LoadListForComboboxArray 在表单的初始化事件中填充。您可以更改此过程以更新输入值的范围或任何其他更改。组合框的列表属性设置为此数组。

请注意:您可能需要考虑调整以下性能以提高性能。我包含了一个文本框,在更改事件中,我根据文本框值将全局数组设置为原始数组的过滤版本。这意味着代码将在您每次输入字母时过滤数组(因此,如果您输入“ABC”,它将过滤三次,每次创建一个新数组)。您可能希望将该函数分配给不同的事件(可能是文本框退出),以便代码仅在您离开文本框时触发,并且仅触发一次。

如果您在修改代码时遇到问题,请告诉我:

Dim ListForCombobox() As String

Private Sub TextBox1_Change()
    Me.ComboBox1.List = Filter(ListForCombobox, Me.TextBox1.Value)
    Debug.Print "CALLED"
End Sub

Private Sub UserForm_Initialize()
    LoadListForComboboxArray
    
    Me.ComboBox1.List = ListForCombobox
End Sub

Private Sub LoadListForComboboxArray()
    Dim rng As Range
    
    Set rng = Sheets("Sheet1").Range("A1:A11")
    
    ReDim ListForCombobox(1 To rng.Rows.Count)
    
    For i = 1 To rng.Rows.Count
        ListForCombobox(i) = rng(i).Value
    Next i
    
    Debug.Print ListForCombobox(1)
End Sub

【讨论】:

  • 谢谢!现在明白了。这真的很有帮助:)
  • 将范围值分配给数据字段数组需要检查单个单元格(或行值)。 - 仅供参考,您可能会从阅读 how to speed up filling/filtering of listbox values on UserForm 中受益 - @basodre
  • @T.M.感谢您的链接。它包括一些有趣的阅读。我上面使用的方法的一个好处是它只需要一次将数据加载到数组中,然后过滤器在内存中完成。我使用Transpose 函数加快了加载时间。我第一次没有这样做,因为Transpose 有 65,536 行的限制。我会注意:我用最多 65k 行测试了我的函数,过滤组合框的平均时间约为每个 filter 0.015 秒。值得注意的是,这种方法只适用于一维数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多