Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
VBA连续类对象引用_Vba_Excel - Fatal编程技术网

VBA连续类对象引用

VBA连续类对象引用,vba,excel,Vba,Excel,我正在从事一个VBA项目,该项目可用于计算通过管道系统的气流特性。风管系统由若干段(VBA类;clsSegment)组成,这些段存储在clsSegments类存储的集合中 每个管段都有一个风管类别(clsDuct),该类别由clsDuctDim类别定义的入口和出口组成 如果希望第2段入口风管继承第1段出口风管的特性,我将使用: set Segments(2).Duct.Inlet = Segments(1).Duct.Outlet 这很有效 同样,我可以通过以下方式选择将入口风管用作出口风管:

我正在从事一个VBA项目,该项目可用于计算通过管道系统的气流特性。风管系统由若干段(VBA类;clsSegment)组成,这些段存储在clsSegments类存储的集合中

每个管段都有一个风管类别(clsDuct),该类别由clsDuctDim类别定义的入口和出口组成

如果希望第2段入口风管继承第1段出口风管的特性,我将使用:

set Segments(2).Duct.Inlet = Segments(1).Duct.Outlet
这很有效

同样,我可以通过以下方式选择将入口风管用作出口风管:

set segments(2).Duct.Outlet = segments(2).Duct.Inlet
现在,如果我想让第n+2段也这样做,我写:

set Segments(3).Duct.Inlet = Segments(2).Duct.Outlet
set Segments(3).Duct.Outlet = Segments(3).Duct.Inlet
这导致第3段实际指向第n段。如果断开段2和段1之间的参照,段3仍然指向段1。这不是我想要的。我希望第3段指向第2段。我想我要做的是指向一个指针,而不是指向存储段1数据的实际内存位置


如何做到这一点

在VBA中没有直接的方法来实现这一点。一个简单的解决方法是向clsSegment类添加复制或克隆方法

段(3).复制段(2)

可以通过添加自定义事件和设置对父对象的引用来自动化更改。我不确定这将如何应用于您的系统,但这里有一个简单的通知系统

clsSegment

Enum DuctEvents
    deInletRemoved
    deOutletRemoved
End Enum

Public Sub DuctChanged(e As DuctEvents)
    'Do Something
End Sub
Public parent As clsSegment
Private WithEvents Inlet As clsDuctDim
Private WithEvents Outlet As clsDuctDim

Private Sub Inlet_DuctRemoved()
    parent.DuctChanged (deInletRemoved)
End Sub

Private Sub Outlet_DuctRemoved()
    parent.DuctChanged (deOutletRemoved)
End Sub
类clsDuctDim

Public Event DuctRemoved()

Private Sub Class_Terminate()
    RaiseEvent DuctRemoved
End Sub
类clsDuct

Enum DuctEvents
    deInletRemoved
    deOutletRemoved
End Enum

Public Sub DuctChanged(e As DuctEvents)
    'Do Something
End Sub
Public parent As clsSegment
Private WithEvents Inlet As clsDuctDim
Private WithEvents Outlet As clsDuctDim

Private Sub Inlet_DuctRemoved()
    parent.DuctChanged (deInletRemoved)
End Sub

Private Sub Outlet_DuctRemoved()
    parent.DuctChanged (deOutletRemoved)
End Sub

我向clsSegment类添加了一个枚举来清理消息传递

好的,我所做的是在Segments类中编写一个house-keeping子类,该子类贯穿所有Segments,并在引用被设置或断开时设置/断开引用。但是我需要手动调用它。当引用被破坏时,您会丢失所有的值,这不是您想要避免的吗?正如您所说,我有一个复制函数,我在其中按引用值进行复制,并将它们存储在临时clsDuctDimension实例中。然后我打断引用,并将值复制到段(2).风管.入口或出口。