Невозможно назначить массив, используя переменную-член массива - PullRequest
2 голосов
/ 02 сентября 2011

У меня есть класс, где одна из переменных-членов является массивом.Я пытаюсь присвоить массив объекту, но получаю ошибку компиляции «Can't assign array».Также мне было интересно, как получить 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

Ответы [ 2 ]

1 голос
/ 02 сентября 2011

Это сработало для меня

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 пытается найти UBound типа данных String, так что это было проблемой.Кроме того, вы не передавали аргумент ary в MsgBox.Свойство ary возвращает строку, но вы использовали ключевое слово Set, что было еще одной проблемой.

0 голосов
/ 02 сентября 2011

Кажется, есть проблема с передачей параметров массива в свойства класса.

Обойти это можно, переключив параметр 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...