Sur*_*osa 14 arrays excel vba types variant
关于变体的问题.我知道Excel vba中的变体既是默认数据类型又效率低(从大型应用程序中过度使用的角度来看).但是,我经常使用它们将数据存储在具有多种数据类型的数组中.我正在研究的一个当前项目本质上是一项需要大量优化非常差的代码(c.7000行)的任务 - 它让我思考; 有没有解决的办法?
解释; 代码经常将数据存储在数组变量中.因此,考虑10列乘10000的数据集.列是多种不同的数据类型(字符串,双精度,整数,日期等).假设我想将它们存储在数组中,我通常会这样做;
dim myDataSet(10,10000) as variant
Run Code Online (Sandbox Code Playgroud)
但是,我的知识说,这将是非常低效的代码评估每个项目,以确定它是什么数据类型(实际上我知道我期待什么).另外,我失去了控制个体数据类型给我的尺寸.所以,(假设前6个是字符串,接下来的4个是为了便于解释这一点),我可以;
dim myDSstrings(6,10000) as string
dim myDSdoubles(4,10000) as double
Run Code Online (Sandbox Code Playgroud)
这让我恢复了控制和效率 - 但也有点笨拙(实际上类型是混合的和不同的 - 我最终在每个中都有奇数个元素,最终必须在代码中单独分配它们 - 而不是质量).所以,它是一个案例;
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...
Run Code Online (Sandbox Code Playgroud)
哪个比丑陋得多;
myDataSet(c,r) = cells(r,c)
Run Code Online (Sandbox Code Playgroud)
所以它让我思考 - 我必须在这里遗漏一些东西.存储不同数据类型数组的最佳方法是什么?或者,假设没有办法 - 存储混合数据类型数组的最佳编码实践是什么?
Dic*_*ika 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
Run Code Online (Sandbox Code Playgroud)
通常比循环遍历行和单元格更快.
我使用具有多种数据类型的数组的首选方法是根本不使用数组.相反,我将使用自定义类模块并为元素创建属性.这不一定是性能提升,但它使代码更容易编写和读取.