【问题标题】:Moving arrays between procedures and class objects在过程和类对象之间移动数组
【发布时间】:2020-08-08 12:30:43
【问题描述】:

我在类对象之间移动数组时遇到问题。这个想法是将某些数据添加到类对象,更改二维数组中的一些参数并将该数组返回到主过程。我已经尝试了所有方法,从公共数组到将数组放入公共字典,但我无法将其从课堂中取出。

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

我的班级对象:

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

在类对象方面也给我带来很多麻烦的是调试器从不突出显示导致问题的行?我发现与常规程序相比,调试它们相当困难。

【问题讨论】:

  • 您的 Add 方法正在处理本地数组,而不是在类级别定义的数组。
  • 你能详细说明你的答案吗?我已将 UserMatrix 数组声明为私有,以便在类中使用?
  • “我不能把它从课堂上拿出来”——当你的代码运行时会发生什么?
  • Dim ClassMatrix() As Variant in Add 创建一个“隐藏”全局数组的本地数组。
  • 对于您的调试问题,请尝试使用 Tools.Options.General 并选中“Break on All Errors”单选按钮。如果你不这样做,那么你就不会在报告的类中得到错误。

标签: arrays vba class


【解决方案1】:

在一些帮助下,我得到了以下代码,适用于任何寻求类似解决方案的人:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多