【VBA研究】怎樣將單元格數據賦給數組


作者:iamlaosong

將工作表中的數據賦給數組或者將數組的數據賦給工作表,一般有兩種。一種是循環的方法,一個一個的傳,這樣的方法一般用於須要對每一個數據特別處理的場合,還有一種是一次性用賦值語句傳,就速度來說,另外一種方法要快得多。看以下例程:

Sub tt()
    Dim arr1(240000, 4)
    Dim arr2()
    
    lineno = [A1048576].End(xlUp).Row      '行數
    '循環給數組賦值。數組myarr必須先定義大小
    t1 = Now()
    For i = 3 To lineno
        k = i - 2
        arr1(k, 1) = Cells(i, 1)
        arr1(k, 2) = Cells(i, 2)
        arr1(k, 3) = Cells(i, 3)
        arr1(k, 4) = Cells(i, 4)
    Next i
    t2 = Now()
    Cells(2, 5) = TimeValue(t2) - TimeValue(t1)
    '一次性給數組賦值。數組arr不能定義大小和類型
    t1 = Now()
    arr2 = Range("a3:d" & lineno)
    t2 = Now()
    Cells(2, 6) = TimeValue(t2) - TimeValue(t1)
    MsgBox arr1(20000, 2) & "=" & arr2(20000, 2)


End Sub

只是要注意的是,循環賦值的方法數組必須先定義維數和大小,然后才干使用,而一次性賦值的正好相反。不能定義維數和大小,否則會報錯。此外注意,數據一次性讀入數組arr2后。arr2成為一個二維數組。即使是讀取一列數據。也是二維數組,數組下標都是從1開始,即arr2(1,1),arr2(2,1),arr2(3,1),arr2(4,1),。。

另一點要注意,當讀取的工作表非當前工作表時。range對象后面須要加上valuekeyword,否則會報錯,比如:

    '方法一:直接讀取
    DaiLiNo = Sheets("代理點").[B65536].End(xlUp).Row           '行數
    DaiLiName = Sheets("代理點").Range("B2:B" & DaiLiNo).Value
    '方法二:激活工作表后讀取
    Worksheets("代理點").Select
    DaiLiNo = [B65536].End(xlUp).Row           '行數
    DaiLiName = Range("B2:B" & DaiLiNo)
    DaiLiNo = DaiLiNo - 1                      '數據從第2行開始,所以總數量要減一

假設賦值范圍用行列號表示,則用下列語句(pos_fst, pos_ems是兩個參數,各自是數據起始行和數據所在列):

maxrow = Cells(65536, pos_ems).End(xlUp).Row

Mail = Range(Cells(pos_fst, pos_ems), Cells(maxrow, pos_ems))

用上面的例程測試發現,即使20多萬條數據,第一種方法用時非常少(4.62963E-05)。而另外一種方法卻差點兒不用時間(0)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM