簡體   English   中英

在大范圍內解析到陣列VBA的最有效方法

[英]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

我認為最好的選擇是:

  1. 嘗試將數據限制為合理的數量,一次說1,000,000個值。
  2. 添加一些錯誤處理以捕獲Out of Memory錯誤,然后重試,但是將大小減小一半,然后減小三分之一,四分之一,依此類推...直到工作。

無論哪種方式,如果我們使用的是5,000,000個值的數據集,並且您要確保程序能夠運行,則需要調整代碼以將數據切碎。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM