我认为我对如何通过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
谢谢!
答案 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
的公共Set
和MyProperty
方法看起来更像是方法。属性“包裹”在字段周围,尤其有助于设置对基础字段的访问。
在您的示例中,您尝试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