Arrays Excel VBA阵列良好做法:立即创建一个巨大的空白阵列,还是始终使用redim PREVENT?

Arrays Excel VBA阵列良好做法:立即创建一个巨大的空白阵列,还是始终使用redim PREVENT?,arrays,excel,vba,Arrays,Excel,Vba,我喜欢使用数组,就像它是一个“内存中”的电子表格一样,因此代码更干净,运行更快 因此,我想问:一般来说,是否最好从一个巨大的数组开始编写代码,比如说Dim arr(10000),这样我就可以像在必要时填充空白表一样使用它,或者这是一种不好的做法,相反,我应该在需要将数据插入数组时始终使用Redim Preserve 提前感谢您的帮助 您的问题的答案取决于您打算如何填充数组(请注意,这是在Excel的上下文中)。以下是四个简单的场景: 从一个范围填充。简单地Dim一个变量,让VBA完成所有工作 D

我喜欢使用数组,就像它是一个“内存中”的电子表格一样,因此代码更干净,运行更快

因此,我想问:一般来说,是否最好从一个巨大的数组开始编写代码,比如说
Dim arr(10000)
,这样我就可以像在必要时填充空白表一样使用它,或者这是一种不好的做法,相反,我应该在需要将数据插入数组时始终使用
Redim Preserve


提前感谢您的帮助

您的问题的答案取决于您打算如何填充数组(请注意,这是在Excel的上下文中)。以下是四个简单的场景:

从一个范围填充。简单地
Dim
一个变量,让VBA完成所有工作

Dim myArray as Variant
Dim myRange as Range

'Set myRange = something
myArray = myRange.Value '<-- Fills a 2-D array
For rowIterator = LBound(myArray,1) to UBound(myArray,1) '<- How identify the size of the first dimension
    For colIterator = LBound(myArray,2) to UBound(myArray,2) '<- How identify the size of the second dimension
        'Do something to myArray(rowIterator, colIterator)
    Next colIterator
Next rowIterator
在循环中填充。尽可能避免这种情况,因为
ReDim
ming数组,尤其是使用
ReDim Preserve
时,计算成本很高。但是,如果您知道这是一个小循环,那么您可能希望接受成本

在循环中调整大小的另一种方法是使用
集合


首先是尺寸过大。不必不断重新确定阵列的尺寸,您可以将阵列尺寸过大,但这样会增加管理未使用阵列插槽的额外管理开销。如何知道“”或0数组中的值是否为“”或0而不是默认的空值

我说如果你记性好的话没有坏处。代码会更简单。一般来说,最佳做法可能是首先正确地对数组进行尺寸标注,这样就不需要
ReDim Preserve
。如果由于某种原因无法实现,那么将阵列扩大到所需的大小并没有什么实际危害。就性能而言,过大的数组大小肯定有利于多个
ReDim Preserve
语句。在许多情况下,您可以在开始填充数组之前计算/计算数组的大小。这将是最好的解决方案,因为您可以正确地对数组进行尺寸标注,但这在很大程度上取决于代码和您实际尝试执行的操作。在所有其他情况下(直接读取图纸范围),我会使用范围。字典的缺点是每个条目(键)都必须是唯一的,与数组相比,它的优点是可以删除、添加、查看是否存在。。。字典的最后一个缺点是,该项不能是udt(用户定义的类型),即使它可以接受对象,所以我觉得这很奇怪。模拟不断增长的值列表的正确方法是在数组已满时将其大小加倍,并保持值的计数(
if count>UBound(arr),然后重拨Preserve arr(UBound(arr))来动态膨胀数组*2)
)。在Java和.Net框架中就是这样做的。没有必要从大数组开始,因为您不会注意到与小数组相比的差异。
Dim myArray() As String
Dim someCounter As Long
'Some early code
someCounter = CLng(myRange.Value)
ReDim myArray(someCounter) '<-- Do this only once.
For iterator = LBound(myArray) to UBound(myArray)
    ' Do Something to myArray(iterator)
Next iterator