【问题标题】:For Each Loop slow for adding data to Listbox in ExcelFor Each Loop 将数据添加到 Excel 中的列表框很慢
【发布时间】:2021-03-18 18:13:51
【问题描述】:

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

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

Plybooker 是来自 Combobox 值的字符串。如果这不是空白,则输入到列表框中的数据会根据这一点进行过滤,因此会出现 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

【问题讨论】:

  • 创建一个数组并为其分配列表框的List 属性。 AddItem 很慢。
  • 感谢您的提示。我是数组的新手,你能给我关于这如何工作的进一步指导吗?我会想出一些东西,但我正在努力解决这个问题,只需要朝着正确的方向轻推!

标签: excel vba loops foreach listbox


【解决方案1】:

这是在循环中使用数组来填充列表框的示例(请注意,数组被翻转,因为在最后调整大小时只能更改最后一个维度,因此您可以使用 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

将源范围加载到数组中并处理它可能会更有效,而不是我把它留给你。 :)

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

【讨论】:

  • 谢谢罗里,非常有帮助。这需要我一段时间才能理解。我收到一个运行时错误,在行:ReDim Preserve myArray(5, i - 1)
  • @Faminebob 我已经编辑了代码,希望现在可以正常运行。
  • 嗨@Rory - 现在在线获得“范围的下标”:myArray(i, 0) = MyCell.Offset(, -1).Value。我尝试将1000 提高到10000,这绝对涵盖了我的数据大小,但仍然抛出相同的错误。
  • @Faminebob 抱歉——我太傻了。我忘了在那里切换行和列索引 - 将修改它。
  • 非常感谢,这是一个比AddItem 更快的解决方案。当If 语句的结果没有返回要输入到列表框中的数据时,我遇到了运行时错误,有时就是这种情况。这给了我“下标超出范围”的行:ReDim Preserve myArray(5, i - 1)
猜你喜欢
  • 2021-12-24
  • 2019-03-02
  • 1970-01-01
  • 1970-01-01
  • 2020-10-11
  • 2014-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多