Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays Can';t使用数组成员变量分配数组_Arrays_Excel_Class_Vba_Object - Fatal编程技术网

Arrays Can';t使用数组成员变量分配数组

Arrays Can';t使用数组成员变量分配数组,arrays,excel,class,vba,object,Arrays,Excel,Class,Vba,Object,我有一个类,其中一个成员变量是数组。我试图将数组分配给对象,但一直出现“无法分配数组”编译错误。我也很好奇如何在对象中获得数组的UBound。UBound(obj.array)不编译。我正在使用Excel07VBA '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 = N

我有一个类,其中一个成员变量是数组。我试图将数组分配给对象,但一直出现“无法分配数组”编译错误。我也很好奇如何在对象中获得数组的UBound。UBound(obj.array)不编译。我正在使用Excel07VBA

'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

将数组参数传递给类属性似乎有问题

您可以通过将Let参数切换为变量来解决此问题:

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
这对我有用

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

正如Tim所说,可以将数组作为变量传递。您的MsgBox正在尝试查找字符串数据类型的UBound,因此这是一个问题。另外,您没有在MsgBox中将参数传递给ary。ary属性返回一个字符串,但您使用的是Set关键字,这是另一个问题。

尝试了您的解决方案,但仍然收到相同的错误。我应该提到的是,当我对get和let属性使用ari时,我之前遇到了一个“相同属性的属性过程的定义不一致”错误。将get to avry更改为解决方法。公共属性Get ary(ByVal索引长度),因为字符串Public Property Let ary(ByRef Value()作为变量)给出了该错误。这可能与数组分配问题有关。如果Let/Set和Get类型不同(在您的例子中是数组与字符串),则应该使用不同的属性名。这就是您最初的“定义不一致”错误告诉您的。注意test()中的Msgbox()调用有一个问题:您的属性ary Get返回一个字符串,但您试图通过调用返回值上的UBound()将其视为一个数组。谢谢,这很有效。我没有使用UBound,而是添加了第三个成员变量,该变量在数组赋值运算符的for循环中充当计数器。我还必须将pary声明为pary()