首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >excel vba:记录集连接和性能

excel vba:记录集连接和性能
EN

Stack Overflow用户
提问于 2015-07-04 03:30:00
回答 1查看 359关注 0票数 0

语境

我在excel VBA中有一个用于在远程数据库上进行只读查询的应用程序.

查询是从UDF执行的,我的应用程序将数据数组从记录集对象传递给函数,并调用Excel将数组写入单元格范围的快速过程。

挑战

应用程序必须能够选择返回数据集顶部的字段名。这对我来说是一个巨大的性能挑战。我所知道的在VBA中为2D数组追加或预置的唯一方法是遍历整个数组。通常,我通过直接将recordset.getRows()对象传递给我的UDF来避免这样的循环。但是,当将字段列表和查询结果与循环方法(我所知道的唯一方法)组合时,我对大量查询的计算时间增加了一倍或三倍。

我对此进行了基准测试:对于2k行和5个字段的查询,不包括字段名的平均calc时间是4.3秒9.8秒有字段名

我的第一次尝试是使用select语句中的UNION子句组合服务器上的字段名和记录集(我的服务器是MySQL)。但是,这不起作用,因为UNION强制数据类型相等,隐式地将我的数字数据转换为字符串。要将它们转换回来,我必须循环遍历数组,否定所获得的任何效率。

我的问题

是否有记录集对象或VBA数组的任何对象方法,可以调用这些对象将一行添加到大型数组中,而无需遍历整个大数组?,在执行MySQL查询之前,字段名都是已知的。

下面是我加入数组的循环。定义记录集+ 1长度的新数组arr,然后遍历它,首先添加字段,然后记录集数组的每一行:

代码语言:javascript
运行
复制
For r = LBound(arr, 1) To UBound(arr, 1)
            If r = LBound(arr, 1) Then
                arr(r) = fieldArray
            Else                    
                arr(r) = Application.Index(rs_array, r - 1, 0)
            End If           
Next
EN

Stack Overflow用户

回答已采纳

发布于 2015-07-04 05:26:01

使用Application.Index可能是组合数组的最慢的方法:使用常规的嵌套循环,您甚至不会注意到任何命中-

代码语言:javascript
运行
复制
Sub TT()

    Dim a(1 To 2000, 1 To 10)

    Dim b(1 To 2000, 1 To 10)
    Dim cc(1 To 2000)

    Dim r, c, t

    t = Timer
    For r = 1 To 2000
        For c = 1 To 10
            b(r, c) = a(r, c)
        Next c
    Next r
    Debug.Print "Loop", Timer - t '>> 0.015625 sec

    t = Timer
    For r = 1 To 2000
        cc(r) = Application.Index(a, r, 0)
    Next r
    Debug.Print "Index", Timer - t '>> 4.195313 sec

End Sub
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31216613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档