2017-02-15 81 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

相關問題