2011-04-10 72 views
12

如果數組是通過引用返回,爲什麼不以下工作:VBA - 從屬性返回數組獲取

'Class1 class module 
Private v() As Double 
Public Property Get Vec() As Double() 
    Vec = v() 
End Property 
Private Sub Class_Initialize() 
    ReDim v(0 To 3) 
End Sub 
' end class module 

Sub Test1() 
    Dim c As Class1 
    Set c = New Class1 
    Debug.Print c.Vec()(1) ' prints 0 as expected 
    c.Vec()(1) = 5.6 
    Debug.Print c.Vec()(1) ' still prints 0 
End Sub 

回答

10

在VBA中,數組永遠不會被引用返回,除非他們通過ByRef參數返回。此外,無論何時使用=將一個數組分配給一個變量,即使將其分配給過程中的ByRef參數,也已經創建了數組的新副本,因此您幾乎不走運試圖做這項工作。

一些替代是...

  • 使用VBA.Collection,而不是一個數組。
  • 製作您自己的封裝了數組的類,並公開用於間接訪問和操作內部數組的過程。
+0

我認爲這是現貨。它與我觀察到的相符。不過,我希望這些東西有更好的記錄。你有沒有一個很好的資料來源(超越經驗),這樣的東西是拼寫出來的? – jtolle 2011-04-10 18:34:08

+0

Chip Person,一位Excel顧問和MVP在他的網站上說,「數組總是通過引用傳遞」http://www.cpearson.com/excel/byrefbyval.aspx他錯了嗎? – ThomasMcLeod 2011-04-10 18:41:56

+0

他的網站當然不錯。儘管如此,我的意思是更多的「官方」資源 - 也就是幫助,用於VB的舊MS手冊等。這使我堅信,諸如「賦予'='副本陣列」等基本功能留給MVP提供,或者讓用戶通過實驗發現。 – jtolle 2011-04-10 18:52:08

23

您沒有讓屬性。此外,get屬性返回整個數組,而不僅僅是有問題的元素。將Property從Double()獲取的返回類型更改爲Double Double。添加屬性讓。請注意,它需要兩個輸入,但只有一個被傳遞給它。假設最後一個變量(本例中爲MyValue)從=符號後的任何值獲取它的值。在Test1()的早期某個位置放置一個斷點,並查看這些值在Locals窗口中的影響。比較由原始代碼創建的變量與我的代碼:

'Class1 class module 
Private v() As Double 
Public Property Get Vec(index As Long) As Double 
    Vec = v(index) 
End Property 
Public Property Let Vec(index As Long, MyValue As Double) 
    v(index) = MyValue 
End Property 
Private Sub Class_Initialize() 
    ReDim v(0 To 3) 
End Sub 
' end class module 

'Begin module 
Sub Test1() 
    Dim c As Class1 
    Set c = New Class1 
    Debug.Print c.Vec(1) ' prints 0 as expected 
    c.Vec(1) = 5.6 
    Debug.Print c.Vec(1) ' prints 5.6 
End Sub 
'End module 
+2

這是一個比公認的更有用的答案。謝謝 :) – 2016-01-22 19:53:01