2016-02-12 1 views
2

У меня возникли проблемы с этим досадным сообщением об ошибке (см. Заголовок) Я видел это на множестве сообщений на этом сайте и других, и это обычно некоторая тупой ошибкой и попытаться, как я могу, я не могу понять, какую тупую вещь я делаю.Определения процедур собственности для одного и того же свойства несовместимы [с использованием массивов]

Public Property Get Contents() As Variant 
    Contents() = pContents() 
End Property 

Public Property Let Contents(Values() As Variant) 
    pContents = Values() 
End Property 

Public Property Get Content(Index As Integer) As String 
    Content = pContents(Index) 
End Property 

Public Property Let Content(Index As Integer, Value As String) 
... 

Цель в том, что пара получить, пусть два позволяют весь массив для чтения/записи, а второй позволяет прочитать/записи к отдельным элементам массива по индексу.

В соответствии с этим: https://msdn.microsoft.com/en-us/library/office/gg251357.aspx

Пусть и получить заявление собственности рюшечки (Да, я довольно новыми для этого) для класса в модуле класса должны отвечать определенным требованиям (которые, я любопытно, почему именно ?). Насколько я могу судить, мои требования соответствуют следующим требованиям:

My Let имеет еще один параметр (2), чем мой Get (1). Я предполагаю, что «как строка» вне скобок не делает В качестве аргумента. Также я использую те же типы (integer и string) как для Let, так и для Get, у меня нет необходимости в Set, чтобы это не было проблемой. Я также попытался изменить имена переменных параметра безрезультатно.

Так что, пожалуйста, помогите мне, что не так, и как я могу избежать этой ошибки в будущем?

ответ

1

Ну, похоже, я сам решил проблему, разместив здесь ответ, если он поможет другим! :)

Меры предосторожности, чтобы при настройке свойств класса в массивы (и их чтение)

1) быть осторожным со скобками(): не использовать их в операторе Пусть

Public Property Let ArrayProperty (newArray as variant) 

как противоположность заманчиво

Public Property Let ArrayProperty (newArray() as variant) 

Точно так же, не следует использовать их при использовании этого свойства, например:

Class1.ArrayProperty = myArray 

нет скобок после MyArray

2) Проверьте, что ваши массивы не пустые в собственности (туАггау) Пусть ЗАЯВЛЕНИЕ

Ссылки здесь VBA: Don't go into loop when array is empty к ответу, который помог мне достичь этого, вам кажется вам необходимо создать свою собственную функцию или использовать обработку ошибок, чтобы сделать это,

IsEmpty(myArray) 

не будет работать.

и фрагмент кода адаптированный для моих целей (кредит оригинальный фрагмент переходит в CreamyEgg):

Public Function IsEmptyArray(TestArray) As Boolean 

Dim lngUboundTest As Long 

lngUboundTest = -1 
    On Error Resume Next 
lngUboundTest = UBound(TestArray) 
On Error GoTo 0 

If lngUboundTest >= 0 Then  
IsEmptyArray = False 
Else 
IsEmptyArray = True 
End If 
End Function 

3) помните, что вы, возможно, потребуется Redim ваш массив свойств в UBOUND (newArray), например,

Public Property Let Contents (newArray as variant) 
'redim pArray to size of proposed array 
ReDim pArray(1 To UBound(newArray)) 
'above line will throw an exception if newArray is empty 
    pArray = newArray 
end Property 

4) преднамеренно делает свойство класса пустой массив, я использовал временный переменный массив, публично объявленный вне суба в начале стандартного модуля

Public TempArray() As Variant 
'outside of Sub ^^ 

Sub SetClass1ArrayToEmpty 
    Erase TempArray 
    class1.ArrayProperty = TempArray 
End Sub 

метод стирания сделать массив пустой, я использовал его, так как я иногда использовал TempArray сделать массивы размером 1 и хотел убедиться, что он был пуст

5) хорошая новость, установив диапазон класса собственности кажется работать так же, путь как установка диапазона для массива, я использовал application.transpose (MyRange), чтобы избежать проблем с один столбец став 2 одномерный массив

class1.ArrayProperty = Application.Transpose(Range(myRange)) 

и что у вас есть, вот это класс, который не работает (нет ошибки компиляции)

Public Property Get Contents() As Variant 
    Contents() = pContents() 
End Property 

Public Property Let Contents(Values As Variant) 
'checks for an empty array being passed to it first 
If IsEmptyArray(Values) Then 
    Erase pContents 
Else 
'redim pContents to size of proposed array 
    ReDim pContents(1 To UBound(Values)) 
     pContents = Values 
End If 
End Property 

Public Property Get Content(Index As Integer) As String 
    Content = pContents(Index) 
End Property 

Public Property Let Content(Index As Integer, Value As String) 

Select Case Index 
    Case Is < 0 
     'Error Handling 
    Case Is > UBound(pContents) + 1 
     'Error Handling 
    Case Is = UBound(pContents) + 1 'append to end of array 
     ReDim Preserve pContents(UBound(pContents) + 1) 
     pContents(Index) = Value 
    Case Else      'replace some middle part of array 
     pContents(Index) = Value 
End Select 

End Property 

Надеюсь, что это поможет некоторым заглянуть!

+0

Спасибо - после многих поисковых запросов я в конце концов нашел это! Удаление() в заявлении Let помогло мне. – samb8s

Смежные вопросы