Class VBA类方法链接

Class VBA类方法链接,class,vba,methods,Class,Vba,Methods,我正在寻找一种“链类方法”的方法,例如,Range对象可以执行“Range.Borders.Color”之类的操作,我猜Borders部分是它自己的类,Range类正在访问它,但我不知道如何实现与我自己的类类似的东西-我甚至不知道这叫什么,经过几个小时的搜索,我想我可能会慢慢地取消学习VBA 有人能不能a)提供我可以用来复制的代码,或者b)告诉我这叫什么,甚至可以把我推向一个有用的方向 当我知道不提供任何代码的时候,我看起来像个傻瓜,考虑下面的伪代码。我知道这很可怕,但这可能有助于我理解: 主要

我正在寻找一种“链类方法”的方法,例如,Range对象可以执行“Range.Borders.Color”之类的操作,我猜Borders部分是它自己的类,Range类正在访问它,但我不知道如何实现与我自己的类类似的东西-我甚至不知道这叫什么,经过几个小时的搜索,我想我可能会慢慢地取消学习VBA

有人能不能a)提供我可以用来复制的代码,或者b)告诉我这叫什么,甚至可以把我推向一个有用的方向

当我知道不提供任何代码的时候,我看起来像个傻瓜,考虑下面的伪代码。我知道这很可怕,但这可能有助于我理解:

主要------------------------------------------------------------------------

Dim obj as class1
set obj = new class1

obj.Target = Range("A1:B5")
obj.Borders.Add

'A1:B5 put into modRange then given borders
Private modRange as range

Public Property Let Target(newTarget as Range)
  set modRange = newTarget
End Property

Public Property Borders()
    Public Sub Add()
        'Code to add borders to modRange
    End Sub 
    Public Sub Remove()
        'Code to remove borders from modRange
    End Sub 
End Property
第一类------------------------------------------------------------------------

Dim obj as class1
set obj = new class1

obj.Target = Range("A1:B5")
obj.Borders.Add

'A1:B5 put into modRange then given borders
Private modRange as range

Public Property Let Target(newTarget as Range)
  set modRange = newTarget
End Property

Public Property Borders()
    Public Sub Add()
        'Code to add borders to modRange
    End Sub 
    Public Sub Remove()
        'Code to remove borders from modRange
    End Sub 
End Property
我知道这不是实际代码的样子。但由于我不知道语法,这是我能想象到的最接近的东西。我想真正的东西应该是class1链接到其他类模块。也许吧

作为旁注。如果我确实有一个名为“Borders”的类(我可能不会)作为class 1对象的一部分,它会与Range对象的Borders部分冲突,并且它有类似的名称吗?或者私人范围会拯救这一天吗


(据我所知,将.Borders.Add/Remove作为一个类来使用有点可笑,我只是遵循语法-诚实)

要拥有对象的复杂属性,需要创建一个新类,然后在父类中创建该类的实例。因此,如果您想要类似于
Class1.Borders.Add()
,您首先必须创建一个新的
CBorders
类(我曾经在VB6/VBA中将
C
预先添加到我的类名中以避免名称冲突)。比如:

'- in class CBorder
Private m_lColor As Long

Public Property Get Color() As Long
    Color = m_lColor
End Property

Public Property Let Color(ByVal lNewColor As Long)
    m_lColor = lNewColor
End Property

Public Sub Reset()
    m_lColor = 0
End Sub

...
然后在1班,你会有这样的东西:

Private m_oBorder As CBorder

Private Sub Class_Initialize()
    ...
    Set m_oBorder = New CBorder
    ...
End Sub

Public Property Get Border() As CBorder
    Set Border = m_oBorder
End Property

...
然后你可以这样做:

Dim obj As Class1
Set obj = New Class1

obj.Borders.Color = ...
...
请注意如何将
Class1
Borders
属性作为
obj
实例的成员访问,以及如何使用
CBorder
类的
Color
属性。将这些值创建为属性可以将这些调用链接在一起


您还需要错误检查和验证代码-为了保持示例简短,我省略了这些代码。

另一个解决方案是返回我,使其可链接

课程模块:CChaining 使用目标函数和返回Me的边框函数来启用链接。使用Subs进行添加和删除,以“完成”链

Private modRange As Range, modRangeBorders As Object

Public Function Target(rng As Range)
    Set modRange = rng
    Set Target = Me
End Function

Public Function Borders()
    Set modRangeBorders = modRange.Borders
    Set Borders = Me
End Function

Public Sub Add()
    modRangeBorders.LineStyle = xlContinuous
End Sub

Public Sub Remove()
    modRangeBorders.LineStyle = xlNone
End Sub
在模块中测试类
很好。。。嗯,有了这个,就可以像其他语言(javascript>jQuery)一样构建一个库,从而使使用Excel VBA变得更容易。

Beautiful。我就快到了,我只是不知道如何将getter设置为一个对象。非常感谢你!