清除Excel组合框需要太长时间

时间:2014-07-22 20:41:38

标签: excel vba excel-vba

更新:看起来它实际上是.clear使得事情变得如此缓慢

所以我有三张三个组合框(每个组合一个),当我更新或刷新组合框时,这个过程大约需要15秒才能完成5个项目。当输入实际数据时,可能有超过50个项目,因此这种性能是不可接受的。

数据源是连接到访问查询的表。

我不确定这是否是Excel中的错误或者我的代码是否那么糟糕。也许我应该考虑数据验证列表而不是组合框。

这是我的代码

Public Sub Workbook_Open()
    Sheet1.PGcustomer.Clear
    Sheet3.PGcustomer.Clear
    Sheet4.PGcustomer.Clear
Dim dataSet As Range

Set dataSet = Sheet2.Range("Customers[Customer]")
    Dim data() As String
    Dim dataSize As Integer
    Dim dictionary As Object
    Dim i As Long

    dataSize = dataSet.Rows.Count
    Set dictionary = CreateObject("Scripting.Dictionary")


    ReDim data(dataSize)
    For i = 1 To UBound(data)
        data(i) = dataSet.Cells(i, 1).Value    '<<< using Cells
        dictionary(data(i)) = 1
    Next i

    Dim v As Variant
    For Each v In dictionary.Keys()
        Sheet1.PGcustomer.AddItem v
        Sheet3.PGcustomer.AddItem v
        Sheet4.PGcustomer.AddItem v
    Next v

Sheet1.PGcustomer.ListIndex = 0
Sheet3.PGcustomer.ListIndex = 0
Sheet4.PGcustomer.ListIndex = 0
End Sub

1 个答案:

答案 0 :(得分:1)

除非你真的需要,否则永远不要遍历细胞。您可以使用以下方法从范围中获取值:

Dim vValues
vValues = ThisWorkbook.Names("Customers[Customer]").Value

vValues现在将包含您范围内的值的数组,您可以直接迭代它们而不是将它们加载到Dictionary对象中 - Dictionary对象也非常昂贵,所以只有在您真正需要它们时才应该使用它们。