使用Redim设置数组数据类型

时间:2017-06-01 14:36:21

标签: excel vba excel-vba

当我第一次创建数组时,我知道最好设置数据类型,因为默认的Variant类型很慢,在VBA中最好避免使用

我注意到了

Redim t(1 To 10) As String

似乎与

具有相同的效果
Dim t() As String
Redim t(1 To 10)

但我想知道;第一个选项首先将t()转换为Variant,然后转换为String,浪费内存并进行双重写入? 或者由于2行,第二个选项实际上更慢。当我Dim数组没有指定其大小时,内存中实际发生了什么?

当然

Dim t(1 To 10) As String

是最有效率的,但我后来需要Redim Preserve,所以不能这样做。

1 个答案:

答案 0 :(得分:4)

  

当我Dim数组而未指定其大小时,内存中实际发生了什么?

你得到一个未初始化的动态大小的数组:VBA"预留一个地点"在记忆中。究竟如何工作是内部管道,只有微软有答案 - 除非你可以逆向工程P代码(假设你可以首先提取编译的P代码)。

DimReDim 都可以充当声明性陈述 - 并不代表应该 - 来自{{3} (强调我的):

  

如果声明的变量在模块级别或过程级别不存在,则ReDim语句充当声明性语句。如果稍后创建具有相同名称的另一个变量,即使在更宽的范围内,ReDim也会引用后面的变量,并且即使Option Explicit有效,也不会导致编译错误。为了避免这种冲突, ReDim不应该用作声明性语句,而只是用于重新定义数组

当你说:

  

或者第二个选项因为2行而实际上更慢。

您忘记了Dim不是可执行语句(您不能在Dim语句中中断)。 ReDim是。所以两个"选项"就运行时而言基本相同,除了第一个(使用ReDim作为声明性语句)是针对最佳实践的。

因此,如果需要动态数组,请使用Dim

声明动态数组
Dim foo() As String

然后当您需要调整大小时,请使用ReDim执行此操作:

ReDim foo(1 To bar)

根据经验,你不应该担心Dim是否比ReDim更有效,或者反过来是否相反 - 那就是' sa 99.9999999997%如果您的代码存在性能问题,则问题在于您的算法,而不是VBA如何实现变量和数组分配。