Как правильно обрабатывать массивы уровня модуля в классе VBA? - PullRequest
2 голосов
/ 17 декабря 2009

Как правильно обрабатывать массив уровня модуля в классе VBA?

Я использую Property Let и Property Get для других переменных, но я не выяснил, как передавать массивы в и из свойств.

Обновлен. Этот код работает благодаря Марку Нольду.

Option Explicit

Private mstrTestArray() As String

Public Property Get TestArray() As String()
    TestArray = mstrTestArray
End Property
Public Property Let TestArray(ByRef strTestArray() As String)
    mstrTestArray = strTestArray
End Property
Public Property Get TestArrayValue(d1 As Long, d2 As Long) As String
    TestArrayValue = mstrTestArray(d1, d2)
End Property
Public Property Let TestArrayValue(d1 As Long, d2 As Long, strValue As String)
    strTestArray(d1, d2) = strValue
End Property

Sub DoTest()

    Dim strTestArray() As String
    ReDim strTestArray(2, 1) As String

    strTestArray(0, 0) = "a": strTestArray(0, 1) = "one"
    strTestArray(1, 0) = "b": strTestArray(1, 1) = "two"
    strTestArray(2, 0) = "c": strTestArray(2, 1) = "three"

    TestArray = strTestArray

    Debug.Print TestArrayValue(UBound(TestArray, 1), UBound(TestArray, 2))

End Sub

Следующее не работает. Эта верхняя часть является методом в вышеприведенном классе:

Sub LetArrayFromReference(ByRef strTestArray() As String)
    TestArray = strTestArray
End Sub

Эта часть представляет собой процедуру, которая вызывает класс:

Sub DoTest()

    Dim strTestArray() As String
    ReDim strTestArray(2, 1) As String
    Dim objTestClass As New TestClass

    strTestArray(0, 0) = "a": strTestArray(0, 1) = "one"
    strTestArray(1, 0) = "b": strTestArray(1, 1) = "two"
    strTestArray(2, 0) = "c": strTestArray(2, 1) = "three"

    objTestClass.LetArrayFromReference strTestArray

    Debug.Print objTestClass.TestArrayValue(UBound(objTestClass.TestArray, 1) _
    , UBound(objTestClass.TestArray, 2))

End Sub

Спасибо!

1 Ответ

2 голосов
/ 17 декабря 2009

Код ниже может дать вам подсказки, чтобы помочь. Сначала определите класс с именем TestClass.

Option Explicit

Private strTestArray() As String

Public Property Get TestArrayValue(d1 As Long, d2 As Long) As String
    TestArrayValue = strTestArray(d1, d2)
End Property

Public Property Let TestArrayValue(d1 As Long, d2 As Long, sValue As String)
    strTestArray(d1, d2) = sValue
End Property


Sub DoTest()

    Dim myTestArray() As String
    ReDim myTestArray(3, 1) As String

    myTestArray(0, 0) = "a": myTestArray(0, 1) = "one"
    myTestArray(1, 0) = "b": myTestArray(1, 1) = "two"
    myTestArray(2, 0) = "c": myTestArray(2, 1) = "three"

    strTestArray = myTestArray
    Me.TestArrayValue(3, 1) = "Hello"


    Debug.Print strTestArray(2, 1)
    Debug.Print Me.TestArrayValue(1, 1)
    Debug.Print Me.TestArrayValue(3, 1)

End Sub

Затем в модуле кода или на рабочем листе создайте подпункт MyTest ();

Option Explicit

Sub MyTest()
  Dim t As New TestClass
  t.DoTest  

  Debug.Print "The value at 1,1 is; " & t.TestArrayValue(1, 1)
End Sub

В классе вы можете обновить strTestArray() или Me.TestArrayValue. Я позволю вам создать Get и установить для TestArray. Я не уверен на 100% в том, что вы пытаетесь сделать .. поэтому, если у вас есть какие-либо вопросы, оставьте комментарий и обновите ваш ОП:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...