Ошибка компиляции VBA: невозможно назначить свойство только для чтения, возвращающее массив из пользовательского класса Get Property

У меня возникла проблема со свойством Get из пользовательского класса в VBA (Excel 2010). Если аргумент индекса не указан, то мое свойство Get должно возвращать ссылку (по крайней мере, это мое впечатление) на массив класса. Если задан индекс, он должен вернуть значение в данном индексе в частном массиве.

' Custom Class Properties
Private pMtbSheets() As String

'Get and Let Methods
Public Property Get MtbSheets(Optional index As Variant) As String()
    If IsMissing(index) Then
        ReDim MtbSheets(1 To UBound(pMtbSheets))
        MtbSheets = pMtbSheets()
    Else
        ReDim MtbSheets(1 To 1)
        MtbSheets(1) = pMtbSheets(index) '**Compiler error occures here**
    End If
End Property

Спасибо за любую помощь, которую кто-либо может предложить


person Bryan Harper    schedule 06.04.2016    source источник
comment
В спецификации вашей функции указано, что возвращаемое значение равно String array. Вы получаете сообщение об ошибке, потому что ваше условие Else пытается вернуть одну строку. В любом случае для меня это было бы запутанным возвратом из функции, потому что мне пришлось бы проверять тип возвращаемой переменной перед ее использованием. Однако, чтобы решить вашу функцию, как написано, измените возвращаемое значение с as String на as Variant.   -  person PeterT    schedule 06.04.2016


Ответы (2)


Вам нужен временный массив, чтобы избежать двусмысленности между интерпретацией MtbSheets(i) как вызова свойства/метода/функции и доступом к массиву:

ReDim temp(1 To 1) As String
temp(1) = pMtbSheets(index)
MtbSheets = temp 
person Alex K.    schedule 06.04.2016
comment
Это сделало это! Спасибо, Алекс. Кроме того, мне нужно было использовать временный массив в первой части оператора If. - person Bryan Harper; 06.04.2016

Изменить: конечно, мой ответ не сработает, вам нужно будет использовать временный массив, как упоминал Алекс К. в своем ответе.

Просто верните массив, как в ветке IsMissing():

' Custom Class Properties
Private pMtbSheets() As String

'Get and Let Methods
Public Property Get MtbSheets(Optional index As Variant) As String()
    If IsMissing(index) Then
        ReDim MtbSheets(1 To UBound(pMtbSheets))
        MtbSheets = pMtbSheets()
    Else
        ReDim MtbSheets(1 To 1)
        MtbSheets = pMtbSheets(index)
    End If
End Property
person Vincent G    schedule 06.04.2016