Excel 如何使VBA类代码仅在对象的一个实例上执行?
下面是一个我无法解释其行为的简化代码。我使用3个不同的类。对象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,其中包含其唯一变量
Dot
,对象cls\u跟踪
和对象cls\u数据集
包含一个名为AllTraces()的数组
在cls\u数据集中
我调用对象的子对象cls\u跟踪
。角点
子项使用类型为tDot
的对象中包含的1Dot
。子对象仅与对象跟踪的一(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文件是正确的代码,上面的文本反映了该代码。今后我会更加警惕。谢谢。对不起,我不明白。你能做的是:对你的问题做一个简单的模型,然后发布一个新问题。在这个问题上,应该有可能重现这个问题。只有这样,这里的用户才能回答这个问题。