2016-06-07 100 views
12

我有一個看似基本的問題,但找不到解決它的任何資源。從VBA範圍創建數組

簡而言之,我只是想將單元格範圍內的所有內容(全部列)加載到數組中。

我能夠通過

DirArray = Array(Range("A1"), Range("A2")) 

手段,但由於某種原因,做到這一點,表達時,我不能創建一個數組是這樣的:

DirArray = Array(Range("A1:A2")) 

我真正的範圍是更長的時間(和可能會有所不同),所以我不希望以這種方式單獨枚舉單元格。任何人都可以告訴我如何正確加載一個整個範圍到一個數組?

對於後者代碼:

MsgBox UBound(DirArray, 1) 

而且

MsgBox UBound(DirArray) 

返回0,而對於前者,他們返回1

+0

遍歷你的範圍。 – findwindow

+0

雖然效率不是那麼低嗎?我當然認爲有一種方法或屬性可以讓整個範圍一次加載到陣列中。或者有類似效果的東西,如果有一個非數組對象類型,我應該用它來代替... – basaltanglia

+1

你應該能夠做到這一點。 - DirArray =範圍(「A1:A2」) – chungtinhlakho

回答

13

只需將變量定義爲一個變體,使他們等於:

Dim DirArray As Variant 
DirArray = Range("a1:a5").Value 

不需要Array命令。

+0

哇,這是非常明顯的。我曾嘗試過,但不是,我認爲,與DirArray(1,1)結合使用,而不是僅僅需要DirArray(1)。非常感謝! – basaltanglia

+1

但那是不是一個變種,而不是一個數組?在這種情況下是否有內存使用差異? –

+0

我現在意識到使用Variant數組是在Excel中執行某些操作的唯一方法之一。 –

15

使用Value2給出了性能優點。按照Charles Williams blog

Range.Value2的工作方式爲Range.Value相同,不同之處在於它不檢查單元格的格式,並轉換爲日期或貨幣。這可能是爲什麼它檢索數字時比.Value更快。

所以

DirArray = [a1:a5].Value2