我可以使用属性重新编写模块级数组吗?

时间:2010-02-03 05:31:38

标签: arrays vba class

我认为我对如何通过Property Get和Let在VBA中处理模块级数组有很好的处理。有没有办法通过属性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

谢谢!

1 个答案:

答案 0 :(得分: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是一个整数字段,但Get的公共SetMyProperty方法看起来更像是方法。属性“包裹”在字段周围,尤其有助于设置对基础字段的访问。

在您的示例中,您尝试ReDim一个返回对数组的引用的属性。我不是百分百肯定,但我认为你不能在数组的引用上使用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