For Each Loop 在 Excel 中向列表框添加数据时速度较慢

For Each Loop slow for adding data to Listbox in Excel

如果某个范围内的值包含“(FS)”,我使用以下循环将数据添加到列表框。

搜索范围定义为AllAreas(12)。用户窗体上的选项按钮定义要搜索的 12 个区域中的哪个,这些由三个整数定义:UprLwrIdx.

Plybooker 是来自组合框值的字符串。如果这不是空白,则输入到列表框中的数据将根据这一点进行过滤,因此 IfElseIf 语句。

该代码工作得非常好,但是在搜索整个范围时非常慢(即搜索 AllAreas 中包含的所有 12 个范围时)。

我需要一种替代方法来将数据添加到列表框,该方法比我的 For Each 循环要快得多。欢迎提出任何建议!

非常感谢

Public Sub PlybookListboxAll()

Dim Plybooker As String
Plybooker = Plybooks.ComboBox1.Value

Dim Upr As Integer, Lwr As Integer
If Plybooks.OptionButton12.Value = True Then
    Lwr = 0
    Upr = 12
End If

If Plybooker = "" Then
        For Idx = Lwr To Upr
            For Each MyCell In AllAreas(Idx).Cells
                If InStr(1, MyCell.Value, "(FS)") > 0 Then 'And IsNumeric(MyCell.Offset(0, 6).Value) Then
                    Plybooks.ListBox1.AddItem
                    Plybooks.ListBox1.List(i, 0) = MyCell.Offset(, -1).Value
                    Plybooks.ListBox1.List(i, 1) = MyCell.Value
                    Plybooks.ListBox1.List(i, 2) = MyCell.Offset(, 2).Value
                    Plybooks.ListBox1.List(i, 3) = MyCell.Offset(, 3).Value
                    Plybooks.ListBox1.List(i, 5) = MyCell.Offset(, 8).Value
                    If IsNumeric(MyCell.Offset(, 6).Value) = True Then
                        Plybooks.ListBox1.List(i, 4) = CInt(MyCell.Offset(, 6).Value)
                    Else: Plybooks.ListBox1.List(i, 4) = "TBC"
                    End If
                    i = i + 1
                End If
            Next MyCell
        Next Idx

ElseIf Plybooker <> "" Then
        For Idx = Lwr To Upr
            For Each MyCell In AllAreas(Idx).Cells
                If InStr(1, MyCell.Value, "(FS)") > 0 And MyCell.Offset(0, 2).Value = Plybooker Then 'And IsNumeric(MyCell.Offset(0, 6).Value)
                    Plybooks.ListBox1.AddItem
                    Plybooks.ListBox1.List(i, 0) = MyCell.Offset(, -1).Value
                    Plybooks.ListBox1.List(i, 1) = MyCell.Value
                    Plybooks.ListBox1.List(i, 2) = MyCell.Offset(, 2).Value
                    Plybooks.ListBox1.List(i, 3) = MyCell.Offset(, 3).Value
                    Plybooks.ListBox1.List(i, 5) = MyCell.Offset(, 8).Value
                    If IsNumeric(MyCell.Offset(, 6).Value) = True Then
                        Plybooks.ListBox1.List(i, 4) = CInt(MyCell.Offset(, 6).Value)
                    End If
                    i = i + 1
                End If
            Next MyCell
        Next Idx
End If

End Sub

这是一个在您用来填充列表框的循环中使用数组的示例(请注意,数组被翻转了,因为您只能在最后调整它的大小时更改最后一个维度,因此您可以使用 Column 属性 将其翻转回控件):

    Dim myArray()
    ReDim myArray(5, 1000) '1000 is a number intended to be larger than the amount of data you expect
    For Idx = Lwr To Upr
        For Each MyCell In AllAreas(Idx).Cells
            If InStr(1, mycell.value, "(FS)") > 0 Then 'And IsNumeric(MyCell.Offset(0, 6).Value) Then
                myarray(0, i) = MyCell.Offset(, -1).Value
                myarray(1, i) = MyCell.Value
                myarray(2, i) = MyCell.Offset(, 2).Value
                myarray(3, i) = MyCell.Offset(, 3).Value
                myarray(5, i) = MyCell.Offset(, 8).Value
                If IsNumeric(MyCell.Offset(, 6).Value) = True Then
                    myarray(4, i) = CInt(MyCell.Offset(, 6).Value)
                Else: myarray(4, i) = "TBC"
                End If
                i = i + 1
            End If
        Next MyCell
    Next Idx
    If i > 0 then
       Redim Preserve myarray(5, i - 1)
       Plybooks.ListBox1.Column = myarray
    End If

将您的源范围加载到一个数组中并对其进行处理可能会更有效率,而不是我将其留给您。 :)

(注意:这是航空代码,所以我可能遗漏了一些东西,但是太长了无法发表评论)