2011-09-02 90 views
2

我有一个类,其中一个成员变量是一个数组。我想分配一个数组到对象,但不断收到'不能分配数组'编译错误。另外我很好奇如何获得对象中的UBound数组。 UBound(obj.array)不能编译。我正在使用excel 07 vba。无法使用数组成员变量分配数组

'Test routine that keeps failing 

Sub test() 

Dim Arr(2) As String 
Arr(0) = "" 
Arr(1) = "Pizza" 
Arr(2) = "Hoes" 

Dim obj As Cats 
Set obj = New Cats 
obj.avry = Arr 
obj.field = 4  
MsgBox UBound(obj.ary) 

End Sub 


'Class declaration 
Private pary() As String 
Private pfield As Long 

Public Property Get ary(ByVal index As Long) As String 
    Set ary = pary(index) 
End Property 

Public Property Let avry(Value() As String) 
    ReDim pary(UBound(Value)) As String 
    For i = LBound(Value) To UBound(Value) 
     pary(i) = Value(i) 
    Next i 
End Property 

Public Property Get field() As Long 
    field = pfield 
End Property 

Public Property Let field(Value As Long) 
    pfield = Value 
End Property 

Private Sub Class_Initialize() 
    pfield = 0 
End Sub 

回答

0

将数组参数传递给类属性似乎存在问题。

您可以通过设参数切换到一个Variant解决这个问题:

Public Property Let avry(ByRef arrVal As Variant) 
    Dim i As Integer 
    If IsArray(arrVal) Then 
     ReDim pary(LBound(arrVal) To UBound(arrVal)) 
     For i = LBound(arrVal) To UBound(arrVal) 
      pary(i) = arrVal(i) 
     Next i 
    End If 
End Property 
+0

尝试了您的解决方案,并且仍然收到相同的错误。我应该提到,在我使用ary获取和让出属性之前,我得到了'同一个属性的属性过程的定义不一致'错误。作为一种解决方法,将获取更改为avry。公共属性Get ary(ByVal index As Long)As String Public Property让ary(ByRef Value()As Variant)给出该错误。也许这与阵列分配问题有关系。 – postelrich

+0

如果Let/Set和Get类型不同(在您的情况下为数组或字符串),您应该使用不同的属性名称。这就是你最初的“不一致的定义”错误告诉你的。请注意,在test()中调用Msgbox()会有问题:属性ary Get返回一个字符串,但您试图通过在返回值上调用UBound()将其作为数组处理。 –

1

这为我工作

Sub test() 

Dim Arr(2) As String 
Arr(0) = "" 
Arr(1) = "Pizza" 
Arr(2) = "Hoes" 

Dim obj As Cats 
Set obj = New Cats 
obj.avry = Arr 
obj.field = 4 
MsgBox obj.ary(2) 

End Sub 

Public Property Get ary(ByVal index As Long) As String 
    ary = pary(index) 
End Property 

Public Property Let avry(vValue As Variant) 
    ReDim pary(UBound(vValue)) As String 
    Dim i As Long 
    For i = LBound(vValue) To UBound(vValue) 
     pary(i) = vValue(i) 
    Next i 
End Property 

Public Property Get field() As Long 
    field = pfield 
End Property 

Public Property Let field(Value As Long) 
    pfield = Value 
End Property 

Private Sub Class_Initialize() 
    pfield = 0 
End Sub 

正如蒂姆说,你可以传递数组作为一个变体。你的MsgBox试图找到一个String数据类型的UBound,所以这是一个问题。另外,你没有将一个参数传递给MsgBox中的ary。 ary属性返回一个String,但是您使用Set关键字,这是另一个问题。

+0

感谢这工作。我没有使用UBound,而是在数组赋值操作符的for循环中添加了第三个用作计数器的成员变量。另外我不得不宣布pary为pary() – postelrich