VBA连续类对象引用

时间:2016-07-05 11:28:34

标签: excel vba excel-vba

我正在研究一个VBA项目,该项目可用于计算通过管道系统的气流特性。管道系统由存储在由类clsSegments存储的Collection中的许多Segments(VBA类; clsSegment)组成。

每个Segment都有一个Duct类(clsDuct),它由clsDuctDim类定义的Inlet和Outlet组成。

如果我想要Segment no。 2 Inlet Duct继承Segment no的属性。我使用的1个出口管道:

set Segments(2).Duct.Inlet = Segments(1).Duct.Outlet

这很有效。

同样,我可以选择使用进气管作为出口管道:

set segments(2).Duct.Outlet = segments(2).Duct.Inlet

现在,如果我想要Segment no。 n + 2做同样的事我写道:

set Segments(3).Duct.Inlet = Segments(2).Duct.Outlet
set Segments(3).Duct.Outlet = Segments(3).Duct.Inlet

这会导致Segment no 3实际指向Segment no。 ñ。如果我打破了段2和段1之间的引用,段3仍然指向段1.这不是我想要的。我希望Segment 3指向Segment 2.我想我想要做的是指向一个指针,而不是指向存储段1数据的实际内存位置。

如何实现这一目标?

1 个答案:

答案 0 :(得分:0)

在VBA中没有直接的方法可以做到这一点。一个简单的解决方法是将复制或克隆方法添加到clsSegment类。

  

细分(3)。复制细分(2)

Sub Copy(segement As clsSegment)
    Me.Duct.Outlet = segement.Duct.Inlet
    Me.Duct.Inlet = segement.Duct.Outlet
End Sub

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

<强> clsSegment

Enum DuctEvents
    deInletRemoved
    deOutletRemoved
End Enum

Public Sub DuctChanged(e As DuctEvents)
    'Do Something
End Sub

Class clsDuctDim

Public Event DuctRemoved()

Private Sub Class_Terminate()
    RaiseEvent DuctRemoved
End Sub

Class clsDuct

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类中添加了一个Enumeration来清理消息。