excel vba:logging集join和性能

上下文

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

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

挑战

该应用程序必须能够select返回数据集顶部的字段名称。 这对我来说是一个巨大的性能挑战。 我知道在VBA中添加或添加二维数组的唯一方法是遍历整个数组。 通常,通过将recordset.getRows()对象直接传递给我的UDF,我可以省去这样一个循环。 但是,将字段列表和查询结果与循环方法(我知道的唯一方法)结合使用时,我将两倍或三倍的计算时间用于较大的查询。

我对此进行了基准testing:对于2k行和5个字段的查询,没有字段名称的平均计算时间是4.3秒 ,字段名称是9.8秒

我第一次尝试是在我的select语句(我的服务器是MySQL)中使用UNION子句在服务器上组合字段名称和logging集。 然而,这不起作用,因为UNION强制数据types相等,隐式地将我的数字数据转换为string。 为了将它们转换回来,我必须遍历数组,否定所获得的任何效率。

我的问题

是否有任何logging集对象或VBA数组的对象方法可以调用预先将一行放到一个大数组而不循环整个大数组? 在执行MySQL查询之前,所有的字段名都是已知的。

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

 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 

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

 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