Перемещение массивов между процедурами и объектами класса - PullRequest
0 голосов
/ 24 апреля 2020

У меня проблемы с перемещением массивов между объектами класса. Идея состоит в том, чтобы добавить определенные данные к объекту класса, изменить некоторые параметры в двухмерном массиве и вернуть этот массив в основную процедуру. Я перепробовал все, от массива publi c до даже помещения массива в словарь publi c, но я не могу вывести его из класса.

Sub ClassArray()

Dim Arr() As Variant
ReDim Arr(1 To 2) As Variant
Arr(1) = "A"
Arr(2) = "B"

Set Class = New ClassObject
Class.Add Arr

Debug.Print Class.Count
Range("A1:C3") = Class.Matrix

End Sub

My Class Object:

Private ClassMatrix(1 To 1, 1 To 1) As Variant
Private Counter As Long
'------
Private Sub Class_Initialize()
    'Appaerently putting the ReDim statement here doesn't do anything
End Sub
'------
Public Sub Add(ByVal Arr As Variant)

x = 3
y = 3

Dim ClassMatrix() As Variant
ReDim ClassMatrix(1 To y, 1 To x)

If Arr(1) = "A" Then
    ClassMatrix(1, 1) = 1
End If

If Arr(2) = "B" Then
    ClassMatrix(3, 3) = 1
End If

End Sub
'------
Property Get Count() As Long
    For x = 1 To 3
        For y = 1 To 3
            If ClassMatrix(y, x) = 1 Then Counter = Counter + 1
        Next y
    Next x
    Count = Counter
End Property
'------
Property Get Matrix() As Variant
    Matrix = ClassMatrix
End Property

Что также доставило мне много проблем с объектами классов, так это то, что отладчик никогда не выделяет строку, вызывающую проблему? Я считаю, что это затрудняет их отладку по сравнению с вашей обычной процедурой.

1 Ответ

0 голосов
/ 25 апреля 2020

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

Option Explicit
Public dict As Dictionary
'------
Sub ClassArray()

Set dict = CreateObject("Scripting.Dictionary")
dict("key1") = "item1"
dict("key2") = "item2"
dict("key3") = "item3"
Debug.Print "dict.Count", dict.Count 'will return 3

Dim Arr() As Variant
ReDim Arr(1 To 2) As Variant

Dim Class As Object
Set Class = New ClassObject

Arr(1) = "A"
Class.Add Arr
Arr(2) = "B"
Class.Add Arr

Debug.Print "Class.Count", Class.Count 'will return 2
Range("A1:C3") = Class.Matrix

End Sub

Объект класса:

Option Explicit
Private ClassMatrix() As Variant
Private Counter As Long
'------
Private Sub Class_Initialize()

Dim x, y
x = dict.Count
y = dict.Count

ReDim ClassMatrix(1 To y, 1 To x)

Debug.Print "ClassMatrix dimensions", UBound(ClassMatrix, 1), UBound(ClassMatrix, 2) 'will return 3, 3

End Sub
'------
Public Sub Add(ByVal Arr As Variant)

If Arr(1) = "A" Then
    ClassMatrix(1, 1) = 1
End If

If Arr(2) = "B" Then
    ClassMatrix(3, 3) = 1
End If

End Sub
'------
Property Get Count() As Long

Dim x, y
For x = 1 To 3
    For y = 1 To 3
        If ClassMatrix(y, x) = 1 Then Counter = Counter + 1
    Next y
Next x
Count = Counter

End Property
'------
Property Get Matrix() As Variant

    Matrix = ClassMatrix

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