2010-05-26 71 views
15

我正在看別人的vba excel代碼。他們在兩個循環中都做着ReDim Preserve dataMatrix(7, i)。這是做什麼的?ReDim Preserve做什麼?

另外,它似乎是第二個循環剛剛覆蓋第一個循環中的數據,是否正確?

Dim dataMatrix() As String 

    Worksheets.Item("ETS").Select 
    Do While Trim(Cells(r, 1)) <> "" 
     Debug.Print "The line: ", Trim(Cells(r, 1)), r 
     r = r + 1 
     dataMatrix(1, i) = Trim(Cells(r, 1)) ''file name 
     dataMatrix(2, i) = Trim(Cells(r, 2)) ''sample type 
     dataMatrix(3, i) = Trim(Cells(r, 3)) ''sample name 
     dataMatrix(4, i) = "ETS" '' 
     dataMatrix(5, i) = Trim(Cells(r, 5)) ''Response 
     dataMatrix(6, i) = Trim(Cells(r, 6)) ''ISTD Response 
     dataMatrix(7, i) = Trim(Cells(r, 10)) ''Calculated Conc 
     i = i + 1 
     ReDim Preserve dataMatrix(7, i) 
    Loop 

    r = 5 
    Worksheets.Item("ETG").Select 
    Do While Trim(Cells(r, 1)) <> "" 
     Debug.Print "The line: ", Trim(Cells(r, 1)), r 
     r = r + 1 
     dataMatrix(1, i) = Trim(Cells(r, 1)) ''file name 
     dataMatrix(2, i) = Trim(Cells(r, 2)) ''sample type 
     dataMatrix(3, i) = Trim(Cells(r, 3)) ''sample name 
     dataMatrix(4, i) = "ETG" 
     dataMatrix(5, i) = Trim(Cells(r, 5)) ''Response 
     dataMatrix(6, i) = Trim(Cells(r, 6)) ''ISTD Response 
     dataMatrix(7, i) = Trim(Cells(r, 10)) ''Calculated Conc 
     i = i + 1 
     ReDim Preserve dataMatrix(7, i) 
    Loop 

回答

11

ReDim當您修改其大小時,會保留數組中的數據。另外,它不應該覆蓋數據,因爲每循環迭代一次就會增加i:第一個循環在遇到空單元之前不會停止,每次迭代將數組長度改爲1,以便在長度爲8時增加1i,新的長度變成9。當發生第二次迭代時,它將新元素寫入索引爲9的數組邊界,再次修改其長度,使其變爲1元素,並迭代,直到遇到空行。

+0

它看起來像第二個循環剛好覆蓋第一個循環中的數據,是否正確? – 2010-05-26 19:21:37

+0

第二個循環不會覆蓋第一個循環中的數據,因爲在第一個循環後我沒有重置。第二個循環將東西附加到第一個循環中生成的數據矩陣中。 – 2010-05-26 19:37:58

16

Redim Preserve允許您在保留數組內容的同時更改數組的維數。

Redim Preserve在每個循環的末尾添加另一行到數組。

我認爲第二個循環附加到數組,因爲i變量在循環之間沒有改變。

+0

另外,它似乎像第二個循環剛剛覆蓋數據在第一個循環,是否正確? – 2010-05-26 19:20:07

+0

不,第二個循環附加到數組,因爲'i'沒有在循環之間重置。 – aphoria 2012-09-17 13:34:32

+0

你的觀點是?幾天前我得到了一個讚揚,引起了我的注意。我在2天前添加了評論,但我也在回答中回答了這個問題。 – aphoria 2012-09-19 14:52:46