Excel 如何使VBA类代码仅在对象的一个实例上执行?

Excel 如何使VBA类代码仅在对象的一个实例上执行?,excel,vba,class,scope,instance,Excel,Vba,Class,Scope,Instance,下面是一个我无法解释其行为的简化代码。我使用3个不同的类。对象Dot,对象cls\u跟踪和对象cls\u数据集包含一个名为AllTraces()的数组 在cls\u数据集中我调用对象的子对象cls\u跟踪。角点子项使用类型为tDot的对象中包含的1Dot。子对象仅与对象跟踪的一(1)个实例相关。但是,从一(1)个only对象Trace执行一(1)个only调用后,存储在数组AllTraces()中的所有其他对象Trace将受到相同的影响 该子角应该编辑点对象左上和右下的值XY,其中包含其唯一变量

下面是一个我无法解释其行为的简化代码。我使用3个不同的类。对象
Dot
,对象
cls\u跟踪
和对象
cls\u数据集
包含一个名为
AllTraces()的数组

cls\u数据集中
我调用对象的子对象
cls\u跟踪
角点
子项使用类型为
tDot
的对象中包含的1
Dot
。子对象仅与对象
跟踪的一(1)个实例相关。但是,从一(1)个only对象
Trace
执行一(1)个only调用后,存储在数组
AllTraces()
中的所有其他对象
Trace
将受到相同的影响

该子
应该编辑
对象
左上
右下
的值XY,其中包含其唯一变量
myTrace
。但是,在执行之后,数组
AllTraces()
中的所有单个
Trace
现在都继承了属于该单个
Trace
对象的值

这可能是VBA的一个细微缺陷吗?或者我的代码中有一个微妙的错误(很可能)?然而,我花了几个小时试图找出问题出在哪里


名为
cls\u数据集的类定义中

Dim AllTraces() As cls_Trace  

Public Sub CreateInterDot()
    Dim i As Long
    SpreadCount = 30
    CNT = UBound(AllTraces)
    For i = 3 To CNT - 1
       PointAddress = AllTraces(i).LPo
       BezelCount = SpreadCount - 1

       Call DebugAllDots
       Call AllTraces(PointAddress).Corners(AllTraces(PointAddress - 1).LXY, True)
       Call DebugAllDots
       Call AllTraces (PointAddress).Corners(AllTraces (PointAddress).LXY, False)
       Call DebugAllDots
    Next i
End Sub
名为
cls\u Trace

Private Type tDot
    Po As Long
    Ra As Double
    CT As clsDot        ' Center XY value
    XY As clsDot        ' XY value for this point
    UperLeft As clsDot  ' One Dot define the Upper Left  corner
    LowRight As clsDot  ' One Dot define the Lower Right
End Type

Dim myTrace As tDot
Dim X As Double, Y As Double

Property Get LXY() As cls__Dot        ' Server for the Dot object
    Set LXY = myTrace.XY
End Property

Public Sub Corners(DotOne As cls__Dot, First As Boolean)
    With myTrace
        X = DotOne.XY(Y)
        If First Then
            Let .UperLeft.XY(Y) = X:     Let .LowRight.XY(Y) = X
            ULX = X: ULY = Y: LRX = X: LRY = Y
        Else
            ULX = IIf(X < ULX, X, ULX): ULY = IIf(Y > ULY, Y, ULY)  ' Upper
            LRX = IIf(X > LRX, X, LRX): LRY = IIf(Y < LRY, Y, LRY)  ' Lower
            Let .UperLeft.XY(ULY) = ULX:     Let .LowRight.XY(LRY) = LRX
        End If
    End With
End Sub
cls\u数据集中
这个
Corners
Sub被一个
cls\u Dot

Private Type XY
    X As Double     ' X value for the point
    Y As Double     ' Y value for the point
End Type

Dim MyXY As XY

Property Let XY(Y As Double, X As Double)   ' Assigne les valeurs X Y au point
    MyXY.X = X: MyXY.Y = Y
End Property

Property Get XY(Y As Double) As Double     ' Serveur X Y de ce point
    XY = MyXY.X: Y = MyXY.Y
End Property
Call AllTraces(PointAddress).Corners(AllTraces(PointAddress - 1).LXY, True)
更简单地说,它看起来是这样的

call MyTrace.Corners(MyDot, True)
在调试代码中,我列出了所有25个对象
跟踪
XY值以及
左上
右下
的XY值。总之,我可以看到记录在每个轨迹实例中的3个点的所有XY值。在VBA调试窗口中,总共是25 x 6个值

在每次迭代
i
时,我将读取所有这150个值。XY将始终保持不变,因为它们是原始数据。每25行将显示每个
点的XY值。但是在
i
的每次迭代中,
UpperLeft
LowerRight
Dot
值将改变,但所有25个对象将看到其
LowerRight
UpperLeft
值变得相同,其中,预期的行为是,每个
右下方
左上方
点应为数组中单个
跟踪
的每个实例采用不同的值

我在代码中的错误在哪里?

进一步调查发现,在VBA模块MainMod子FillClassDataSet中,变量对象的实例定义
Set currentPoint=新的cls\uuuuu点
设置当前跟踪=新的cls\U跟踪
,如果我替换了I循环中的currentTrace定义,那么我将为每个I迭代创建该变量的新实例。这将纠正问题。然后代码就可以正常工作了。我现在必须明白为什么会这样。它应该不会工作得更好,因为在
cls\u跟踪
类定义中已经嵌入了一个
.copy
函数,该函数应该负责确保创建该跟踪的新实例

此外,在
cls\u数据集类Public Sub AppendTrace
中,当新的跟踪实例添加到数组中时,这里还有一个
.copy
调用

所以现在的问题是:在我的类定义中,我系统地创建了一个新实例,为什么必须创建一个新实例


谢谢大家的帮助:)

代码无法编译。提供完整的代码以及使用类的代码。您使用选项显式吗?如果没有,请尝试使用它。@Dee:我编辑了我的问题,并添加了一个到EXCEL文件的链接。代码按预期编译。谢谢这里有
clsRange
clsCircle
?在您的excel工作簿中有不同的类,除了
cls\uu Dot
@dee:我重新编辑了我的问题。对不起,错配了。我想通过编辑一些命名使我的代码更具可读性,但没有更新我的问题。EXCEL文件是正确的代码,上面的文本反映了该代码。今后我会更加警惕。谢谢。对不起,我不明白。你能做的是:对你的问题做一个简单的模型,然后发布一个新问题。在这个问题上,应该有可能重现这个问题。只有这样这里的用户才能回答这个问题。代码不会编译。提供完整的代码以及使用类的代码。您使用选项显式吗?如果没有,请尝试使用它。@Dee:我编辑了我的问题,并添加了一个到EXCEL文件的链接。代码按预期编译。谢谢这里有
clsRange
clsCircle
?在您的excel工作簿中有不同的类,除了
cls\uu Dot
@dee:我重新编辑了我的问题。对不起,错配了。我想通过编辑一些命名使我的代码更具可读性,但没有更新我的问题。EXCEL文件是正确的代码,上面的文本反映了该代码。今后我会更加警惕。谢谢。对不起,我不明白。你能做的是:对你的问题做一个简单的模型,然后发布一个新问题。在这个问题上,应该有可能重现这个问题。只有这样,这里的用户才能回答这个问题。