2010-02-03 60 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

相关问题