2017-02-15 82 views
1

我在Excel VBA中创建了一个二维动态数组。大部分的代码示例我能看到的是这样的:在Excel VBA中创建动态数组而不是“dim”时是否有任何理由使用“redim”?

Dim companyArray() As Variant 
Dim height, width As Integer 
width = 2 
height = WorksheetFunction.CountA(Worksheets(1).Columns(1)) 
ReDim companyArray(height, width) 

是否有一个原因,我不想声明数组我已经得到了height变量值之后?如果可能的话,我会不想避免使用ReDim?

+1

Dim和ReDim不可互换,他们做不同的事情。 – RBarryYoung

+0

您已经“变暗”了'companyArray',所以您必须使用'redim'。另一种方法是不要在代码的上半部分“变暗”变量,然后立即在当前使用“ReDim”的地方使用“Dim”。你只能“变暗”一次变量,然后你必须使用'Redim'。 (至少这是理论,实际上它是这样的:http://stackoverflow.com/questions/12907050/redim-without-dim) – Ralph

回答

5

Dim companyArray(1 to 5)是静态大小调整:需要您编写代码时知道的边界是常量。

Redim companyArray(1 to x)是动态调整大小,在程序运行时计算边界时需要。

在编码时未知任何边界(在任何维上)时,Redim是唯一选项。


谨慎

Redim的话不需要这个变量来之前变暗,你可以声明和REDIM动态数组。 但是,这样做有一定的风险。考虑这个

' Module 
Dim X as variant ' some module-level (or global) variable 
'''''''''''''''''' 
' Some code 
''''''''''''''''' 
Sub foo() 
    Redim X(1 to 3) as long ' <-- Will redim the global X 
    .... 
End Sub 

如果写foo当程序员的意图是一次性申报局部变量Redim it,那么这将失败,因为Redim声明将在全球X操作,因为它是在范围之内。

的底线是,Redim声明并redims变量,如果具有相同名称的变量在其范围存在,它将REDIM,而不是创建一个新的变量,变量。出于这个原因,尽管这不是绝对必要的,但在Redim之前使用Dim是比较安全的,这是通过良好实践的规则。

Sub foo() 
    Dim X() as Long 
    Redim X(1 to 3) as long ' <-- Will now refer to the local variable X 
    .... 
End Sub 
+0

“编码时间”,又名“编译时间”;-) –

+2

@ Mat'sMug ,非常适合应用程序的Visual Basic。 :) –

+1

这是总的意义。非常感谢。 – cemattis

相关问题