Могу ли я переопределить массив уровня модуля, используя свойство? - PullRequest
1 голос
/ 03 февраля 2010

Я думаю, что у меня есть довольно хорошая справка о том, как обрабатывать массивы уровня модуля в VBA через свойства Get и Let.Есть ли способ переопределить массив уровня модуля через свойство?

Следующие ошибки кода в операторе ReDim в последней процедуре (DoTest).

Private mstrTestArray() As String

Private Sub Class_Initialize()
    ReDim mstrTestArray(0) As String
End Sub

Private Property Get TestArray() As String()
    TestArray = mstrTestArray
End Property

Private Property Let TestArray(ByRef strTestArray() As String)
    mstrTestArray = strTestArray
End Property

Private Property Get TestArrayValue(d1 As Long) As String
    TestArrayValue = mstrTestArray(d1)
End Property

Private Property Let TestArrayValue(d1 As Long, strValue As String)
    mstrTestArray(d1) = strValue
End Property

Sub DoTest()
    Dim intCharCode As Integer
    For intCharCode = 97 To 122
        If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then
            TestArrayValue(UBound(TestArray)) = Chr(intCharCode)
        Else
            ReDim Preserve TestArray(UBound(TestArray) + 1) As String
            TestArrayValue(UBound(TestArray)) = Chr(intCharCode)
        End If
    Next intCharCode
    Debug.Print TestArrayValue(LBound(TestArray)) _
    & " through " _
    & TestArrayValue(UBound(TestArray))
End Sub

Спасибо!

1 Ответ

2 голосов
/ 03 февраля 2010

Это хороший вопрос. Я отвечу на ваш вопрос прямо внизу, но давайте начнем с краткого фона объектно-ориентированного программирования в VBA. В большинстве объектно-ориентированных языков свойство будет часто выглядеть как поле , но действует как метод . Что это значит?

Когда вы создаете экземпляр класса и задаете значение для свойства, оно выглядит следующим образом:

Sub TestMyClass()
    Dim mc As MyClass
    Set mc = new MyClass
    mc.MyProperty = 1
End Sub

В приведенном выше коде MyProperty выглядит как поле, верно? Но давайте посмотрим, как это определено в классе:

Private pMyProperty As Integer

Public Property Get MyProperty() As Integer
    MyProperty = pMyProperty
End Property

Public Property Let MyProperty(lMyProperty As Integer)
    pMyProperty = lMyProperty
End Property

Как вы можете видеть из приведенного выше кода, хотя pMyProperty является полем Integer, публичные Get и Set методы для MyProperty на самом деле больше похожи на методы. Свойство «оборачивается» вокруг поля и особенно полезно при настройке доступа к базовому полю.

В вашем примере вы пытались ReDim свойство, которое возвращает ссылку на массив. Я не уверен на 100%, но я не думаю, что вы можете использовать ReDim для ссылки массива.

Я изменил ваш код, чтобы изменить собственное поле mstrTestArray, и оно, похоже, работало нормально. Это то, что вы можете попробовать?

Sub DoTest()
    Dim intCharCode As Integer
    For intCharCode = 97 To 122
        If Not Len(TestArrayValue(UBound(TestArray))) > 0 Then
            TestArrayValue(UBound(TestArray)) = Chr(intCharCode)
        Else
            ReDim Preserve mstrTestArray(UBound(mstrTestArray) + 1) As String
            TestArrayValue(UBound(TestArray)) = Chr(intCharCode)
        End If
    Next intCharCode
    Debug.Print TestArrayValue(LBound(TestArray)) _
    & " through " _
    & TestArrayValue(UBound(TestArray))
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...