2010-02-03 49 views
1

我想我有一個相當不錯的句柄來處理如何通過Property Get和Let來處理VBA中的模塊級數組。有沒有辦法通過屬性ReDim模塊級別的數組?我可以使用屬性ReDim模塊級別數組嗎?

在上次過程(DoTest)中的ReDim語句處出現以下代碼錯誤。

Private mstrTestArray() As String 

Private Sub Class_Initialize() 
    ReDim mstrTestArray(0) As String 
End Sub 

Private Property Get TestArray() As String() 
    TestArray = mstrTestArray 
End Property 

Private Property Let TestArray(ByRef strTestArray() As String) 
    mstrTestArray = strTestArray 
End Property 

Private Property Get TestArrayValue(d1 As Long) As String 
    TestArrayValue = mstrTestArray(d1) 
End Property 

Private Property Let TestArrayValue(d1 As Long, strValue As String) 
    mstrTestArray(d1) = strValue 
End Property 

Sub DoTest() 
    Dim intCharCode As Integer 
    For intCharCode = 97 To 122 
     If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     Else 
      ReDim Preserve TestArray(UBound(TestArray) + 1) As String 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     End If 
    Next intCharCode 
    Debug.Print TestArrayValue(LBound(TestArray)) _ 
    & " through " _ 
    & TestArrayValue(UBound(TestArray)) 
End Sub 

謝謝!

回答

2

這是一個很好的問題。我會直接在底部回答你的問題,但讓我們從VBA中面向對象編程的簡要背景開始。在大多數面向對象的語言,一個財產往往會看起來,但行爲方法。這是什麼意思?

當你實例化一個類和值設置爲一個屬性,它看起來像這樣:

Sub TestMyClass() 
    Dim mc As MyClass 
    Set mc = new MyClass 
    mc.MyProperty = 1 
End Sub 

在上面的代碼,MyProperty看起來像一個領域,對不對?但是,讓我們來看看它是如何在類中定義:

Private pMyProperty As Integer 

Public Property Get MyProperty() As Integer 
    MyProperty = pMyProperty 
End Property 

Public Property Let MyProperty(lMyProperty As Integer) 
    pMyProperty = lMyProperty 
End Property 

正如你可以在上面的代碼中看到,而pMyProperty是一個整場,公衆GetSet方法MyProperty其實看起來更像方法。一個屬性「圍繞」一個字段,對於設置對基礎字段的訪問特別有幫助。

在你的例子中,你試圖ReDim一個返回對數組的引用的屬性。我不是100%確定的,但我不認爲你可以在參考的數組上使用ReDim

我改變了你的代碼來修改實際的私人字段mstrTestArray,它似乎工作正常。那是你可以嘗試的嗎?

Sub DoTest() 
    Dim intCharCode As Integer 
    For intCharCode = 97 To 122 
     If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     Else 
      ReDim Preserve mstrTestArray(UBound(mstrTestArray) + 1) As String 
      TestArrayValue(UBound(TestArray)) = Chr(intCharCode) 
     End If 
    Next intCharCode 
    Debug.Print TestArrayValue(LBound(TestArray)) _ 
    & " through " _ 
    & TestArrayValue(UBound(TestArray)) 
End Sub 
+0

本,這是非常有幫助的。我沒有'ReDim mstrTestArray',因爲我認爲使用屬性而不是實際的模塊級變量會更「最佳實踐」。但是我認爲你是對的,ReDim沒有辦法通過引用返回數組。我猜想另一種方法是在DoTest中使用本地數組變量,並在DoTest結束時設置TestArray = strTestArray,即使它的實時性稍差。謝謝! – Kuyenda 2010-02-03 20:02:49

+0

我絕不是VBA專家,但是我沒有看到使用類*中的*私有變量'mstrTestArray'來改變它的值有什麼問題。我認爲如果有人正在使用你的對象,並且對'mstrTestArray'在類內部發生了變異感到困惑,它可能*會引起混淆。如果你要在VBA中做很多工作,可以考慮獲得** VBA Developer's Handbook **:http://www.amazon.com/VBA-Developers-Handbook-Ken-Getz/dp/0782119514 – 2010-02-03 20:38:25

+0

這本書是否真的涵蓋了這個東西?我從來沒有找到像這樣徹底的書:http://www.cpearson.com/excel/mainpage.aspx。再次感謝Ben! – Kuyenda 2010-02-04 14:59:13

相關問題