2012-03-29 103 views
1

我有這樣的代碼:VBA:我改變了ARR(0),不明白爲什麼ARR(1)改變了?

Call MakeRoomForArrayItem(interAll, 0) 

interAll(0).StartY = tempStartY 
interAll(0).K = tempK 

在我被一個成功地創建一個新的細長interAll()的第一行。

然後我希望第二行和第三行僅影響interAll(0),但它們對interAll(1)執行相同的更改。爲什麼是這樣?我沒有成功創建interAll(1)的新對象嗎?

Sub MakeRoomForArrayItem(ItemArray As Variant, ByVal ItemElement As Integer) 
    Dim i As Integer 
    ReDim Preserve ItemArray(LBound(ItemArray) To UBound(ItemArray) + 1) 

    For i = UBound(ItemArray) - 1 To ItemElement Step -1 
     Set ItemArray(i + 1) = ItemArray(i) 
    Next 
    'Erase values in object ItemArray(ItemElement) would be nice 
End Sub 

我在其他情況下成功地使用了相同的功能。它可能與調用函數中缺少聲明有關嗎?

編輯:我加入

Set interval = New CInterval 
Set interAll(0) = interval 

你能向我解釋這裏到底發生了什麼,這樣我就不會再犯同樣的錯誤修復了這個問題?

+0

噓,千萬不要忘了給予好評,你發現的有用的意見,並接受你找到最有用的答案! (它不一定是我的!) – 2012-03-29 22:18:46

回答

1

這取決於你通過什麼樣的變量MakeRoomForArrayItem。如果陣列是持有值類型變量,如整型或布爾,那麼它會工作,因爲賦值語句

Set ItemArray(i + 1) = ItemArray(i) 

被複制的值。但是,如果您正在使用通過引用傳遞的變量,那麼您並未複製其值,而是將引用複製到變量中。在這種情況下,您似乎傳遞了一個類變量,它將通過引用傳遞。

編輯:當你打電話到New CInterval,你實際上分配一個新的變量,而不是複製一個引用到以前的變量。這就是你的修復工作的原因。沒有你的修復,你只有一個「槽」在內存中保存一個值,但你的數組多次引用該內存。修復之後,您在內存中擁有與調用New CInterval一樣多的「插槽」,並且陣列的每個元素都引用新的內存位置。

也許下面的代碼將有助於:

Set interval1 = New CInterval ' you have a single CInterval instance 
Set interval2 = New CInterval ' changes to interval1 or interval2 do not affect each other 
Set interval3 = interval2  ' changes to interval3 also make changes to interval2, 
           ' because they are the same object. 
Dim arr as CInterval(3)   
' Create a single array that has 3 elements, 
' which will hold 3 references to CInterval instances. 
' Those references may or may not be to the same actual CInterval instance. 

Set arr(0) = interval1 ' the first element of the array references the first object instance 
Set arr(1) = interval1 ' the second element of the array also references the first object instance 
Set arr(2) = interval2 ' the third element of the array references the second object instance. 
         ' Changes to this element will affect both interval2 and interval3, because they are references to the same object in memory. 
1

當你這樣做:

Set ItemArray(i + 1) = ItemArray(i)

要複製引用,而不是值。因此,在循環結束時,當i=0時,該行說的是「將對象的引用複製到位置1的ItemArray(0)」。因此,ItemArray(0)ItemArray(1)都包含指向相同對象實例的引用。您應該能夠使用調試器來確認這一點。

相關問題