[英]Most efficient way to parse in a large range in to an array VBA
我在excel中有大量數據,我想將它們解析為用戶定義函數的數組。 范圍是2250 x2250。通過for循環解析每個單元格花費的時間太長,而且太大了,無法通過此方法分配給數組:
dim myArr as Variant
myArr = range("myrange")
只是在這里集思廣益,在每一列中進行解析並加入數組會更有效嗎? 有任何想法嗎?
謝謝
你快到了
您需要的代碼是:
Dim myArr as Variant
myArr = range("myrange").Value2
請注意,我正在使用范圍的.Value2
屬性,而不僅僅是“ Value”,它讀取格式和語言環境設置,並且可能會弄亂任何日期
還要注意,我也沒有費心Redim
並指定數組的尺寸:Value和Value2屬性是二維數組,(1到行數,1到列數)...除非它是單個單元格,這將是一個標量變體,它將破壞期望數組的所有下游代碼。 但這不是已知2250 x 2250范圍的問題。
如果您反轉操作,並將數組寫回到某個范圍,則需要將接收范圍的大小完全設置為數組的尺寸。 同樣,您提出的問題也不是您的問題:但是通常這兩個操作會同時進行。
一般原則是,每次對工作表的“命中”都需要大約二十秒的時間-有些機器速度更快,但是它們的日子都不好過-“命中”或將單個單元格讀取到變量幾乎完全是就像將700萬個單元的范圍讀入一個變體數組一樣。 兩者都是在同一時刻讀取范圍在一個小區快好萬次。
無論哪種方式,一旦完成“讀入”並停止與工作表的交互,您最好將VBA中的任何操作都計為在零時間內發生。
這些數字都是非常粗糙的,但是一般的原則會一直保持下去,直到您開始分配不適合工作內存的數組之時,同樣,這也不是今天的問題。
記住,完成后要Erase
數組變量,而不要依賴它超出范圍:在這種大小的范圍內,會有所作為。
這很好。
Sub T()
Dim A() As Variant
A = Range("A2").Resize(2250, 2250).Value2
Dim i As Long, j As Long
For i = 1 To 2250
For j = 1 To 2250
If i = j Then A(i, j) = 1
Next j
Next i
Range("A2").Resize(2250, 2250).Value2 = A
End Sub
我認為最好的選擇是:
Out of Memory
錯誤,然后重試,但是將大小減小一半,然后減小三分之一,四分之一,依此類推...直到工作。 無論哪種方式,如果我們使用的是5,000,000個值的數據集,並且您要確保程序能夠運行,則需要調整代碼以將數據切碎。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.