更快的用户表单列表框筛选Excel VBA

更快的用户表单列表框筛选Excel VBA,vba,excel,listbox,Vba,Excel,Listbox,我正在开发一个用户表单,其中有一个列表框。我正在加载listbox,但只加载select数据,并基于userform中的不同下拉列表。我的样本表经过了6000行,但我被告知它最终将包括20000+行。过滤已经需要10秒左右的时间了。有没有更有效的方法 代码如下: For rowNum = isStartRow To isEndRow Dim h2T As String: h2T = iSH.Range(h2 & rowNum).Text Dim h3T As Strin

我正在开发一个用户表单,其中有一个列表框。我正在加载listbox,但只加载select数据,并基于userform中的不同下拉列表。我的样本表经过了6000行,但我被告知它最终将包括20000+行。过滤已经需要10秒左右的时间了。有没有更有效的方法

代码如下:

For rowNum = isStartRow To isEndRow

    Dim h2T As String: h2T = iSH.Range(h2 & rowNum).Text
    Dim h3T As String: h3T = iSH.Range(h3 & rowNum).Text
    Dim h4T As String: h4T = iSH.Range(h4 & rowNum).Text
    Dim h5T As String: h5T = iSH.Range(h5 & rowNum).Text
    Dim descT As String: descT = UCase(iSH.Range(desc & rowNum).Text)

    If h2T Like "*" & Me.cmbo_H2.value & "*" And h3T Like "*" & Me.cmbo_H3.value & "*" And h4T Like "*" & Me.cmbo_H4.value & "*" And h5T Like "*" & Me.cmbo_H5.value & "*" And descT Like "*" & UCase(Me.txt_Search.value) & "*" And (iSH.Range("A" & rowNum) = 10 Or iSH.Range("A" & rowNum) = 20) Then

        If Not Exists(Me.cmbo_H2, h2T) Then Me.cmbo_H2.AddItem h2T
        If Not Exists(Me.cmbo_H3, h3T) Then Me.cmbo_H3.AddItem h3T
        If Not Exists(Me.cmbo_H4, h4T) Then Me.cmbo_H4.AddItem h4T
        If Not Exists(Me.cmbo_H5, h5T) Then Me.cmbo_H5.AddItem h5T

        Me.list_Items.AddItem iSH.Range(desc & rowNum).Text
        Me.list_Items.List(Me.list_Items.ListCount - 1, 1) = iSH.Range(codeCol & rowNum).Text
        Me.list_Items.List(Me.list_Items.ListCount - 1, 2) = iSH.Range(iNumber & rowNum).Text
        Me.list_Items.List(Me.list_Items.ListCount - 1, 3) = iSH.Range(moqCol & rowNum).Text

    End If

Next

更有效的方法是将范围读入数组,然后在数组中执行所有处理。从处理时间的角度来看,读取工作表的成本很高,请将其读取一次到阵列,然后进行处理


这可能会对你有所帮助

我在考虑这个问题。我要试一试不可以。。。还是一样的速度不要从范围中读取
.text
,它是最慢的(而是读取
.value2')。不过,如果您先将整个范围放入阵列中,速度会更快。而且你的假发看起来很可怕,我的眼睛流血了。相反,只执行一个条件,如果是treu,则执行下一个条件,依此类推。首先是最罕见的情况。最后,不要使用
range()
,而是使用
单元格(y,x)`。也要使用变量,而不是多次读取同一范围/单元格!在第二个结果下,如果你应用所有这些。这是我见过的最有趣的评论。谢谢