For Each Loop 在 Excel 中向列表框添加数据时速度较慢
For Each Loop slow for adding data to Listbox in Excel
如果某个范围内的值包含“(FS)”,我使用以下循环将数据添加到列表框。
搜索范围定义为AllAreas(12)
。用户窗体上的选项按钮定义要搜索的 12 个区域中的哪个,这些由三个整数定义:Upr
、Lwr
和 Idx
.
Plybooker
是来自组合框值的字符串。如果这不是空白,则输入到列表框中的数据将根据这一点进行过滤,因此 If
、ElseIf
语句。
该代码工作得非常好,但是在搜索整个范围时非常慢(即搜索 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
将您的源范围加载到一个数组中并对其进行处理可能会更有效率,而不是我将其留给您。 :)
(注意:这是航空代码,所以我可能遗漏了一些东西,但是太长了无法发表评论)
如果某个范围内的值包含“(FS)”,我使用以下循环将数据添加到列表框。
搜索范围定义为AllAreas(12)
。用户窗体上的选项按钮定义要搜索的 12 个区域中的哪个,这些由三个整数定义:Upr
、Lwr
和 Idx
.
Plybooker
是来自组合框值的字符串。如果这不是空白,则输入到列表框中的数据将根据这一点进行过滤,因此 If
、ElseIf
语句。
该代码工作得非常好,但是在搜索整个范围时非常慢(即搜索 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
将您的源范围加载到一个数组中并对其进行处理可能会更有效率,而不是我将其留给您。 :)
(注意:这是航空代码,所以我可能遗漏了一些东西,但是太长了无法发表评论)