繁体   English   中英

Excel VBA:数组变量中的变体

[英]Excel VBA: Variants in Array Variables

关于变体的问题。 我知道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)

所以它让我思考 - 我必须在这里遗漏一些东西。 存储不同数据类型数组的最佳方法是什么? 或者,假设没有办法 - 存储混合数据类型数组的最佳编码实践是什么?

切勿在不先测量的情况下优化代码。 你可能会惊讶于代码最慢的地方。 我使用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

通常比循环遍历行和单元格更快。

我使用具有多种数据类型的数组的首选方法是根本不使用数组。 相反,我将使用自定义类模块并为元素创建属性。 这不一定是性能提升,但它使代码更容易编写和读取。

我不确定你的瓶颈是否来自阵列的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

这个来源 ,你应该阅读VBA优化。

但是,您应该分析您的应用以查看您的瓶颈所在。 请参阅Issun的这个问题,以帮助您对代码进行基准测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM