关于变体的问题。我知道Excel vba中的变体既是默认数据类型又效率低(从大型应用程序中过度使用的角度来看)。但是,我经常使用它们将数据存储在具有多种数据类型的数组中。我正在研究的一个当前项目本质上是一项需要大量优化非常差的代码(c.7000行)的任务 - 它让我思考;有办法解决这个问题吗?
解释;代码经常将数据存储在数组变量中。因此,考虑10列乘10000的数据集。列是多种不同的数据类型(字符串,双精度,整数,日期等)。假设我想将它们存储在数组中,我通常会这样做;
dim myDataSet(10,10000) as variant
但是,我的知识说,这将是非常低效的代码评估每个项目以确定它是什么数据类型(实际上我知道我期待什么)。另外,我失去了控制个体数据类型给我的尺寸。所以,(假设前6个是字符串,接下来的4个是为了便于解释这一点的两倍),我可以;
dim myDSstrings(6,10000) as string
dim myDSdoubles(4,10000) as double
这让我恢复了控制和效率 - 但也有点笨拙(实际上类型是混合的和不同的 - 我最终在每个中都有奇数个元素,最终必须单独分配它们在代码中而不是在质量上。所以,它是一个案例;
myDSstrings(1,r) = cells(r,1)
myDSdoubles(2,r) = cells(r,2)
myDSstrings(2,r) = cells(r,3)
myDSstrings(3,r) = cells(r,4)
myDSdoubles(3,r) = cells(r,5)
..etc...
哪个比丑陋得多;
myDataSet(c,r) = cells(r,c)
所以我想到了 - 我必须在这里遗漏一些东西。存储不同数据类型数组的最佳方法是什么?或者,假设没有办法 - 存储混合数据类型数组的最佳编码实践是什么?
答案 0 :(得分:11)
在未先测量的情况下,切勿优化代码。你可能会惊讶于代码最慢的地方。我使用Professional Excel Development中的PerfMon实用程序,但您也可以使用自己的PerfMon实用程序。
读取和写入Excel Ranges是一个很重要的时间。尽管Variants可以浪费大量内存,但
Dim vaRange as Variant
vaRange = Sheet1.Range("A1:E10000").Value
'do something to the array
Sheet1.Range("A1:E10000").Value = vaRange
通常比循环遍历行和单元格更快。
我使用具有多种数据类型的数组的首选方法是根本不使用数组。相反,我将使用自定义类模块并为元素创建属性。这不一定是性能提升,但它使代码更易于编写和阅读。
答案 1 :(得分:4)
我不确定您的瓶颈是来自Variant
数组的输入。
顺便说一下,要将值从数组设置为Excel范围,您应该使用(在Excel 8或更高版本中):
Range("A1:B2") = myArray
在以前的版本中,您应该使用以下代码:
Sub SuperBlastArrayToSheet(TheArray As Variant, TheRange As Range)
With TheRange.Parent.Parent 'the workbook the range is in
.Names.Add Name:="wstempdata", RefersToR1C1:=TheArray
With TheRange
.FormulaArray = "=wstempdata"
.Copy
.PasteSpecial Paste:=xlValues
End With
.Names("wstempdata").Delete
End With
End Sub
来自this source的您应该阅读VBA优化。
但是,您应该分析您的应用以查看您的瓶颈所在。请参阅this question from Issun以帮助您对代码进行基准测试。