VBA类方法链接

时间:2013-07-20 17:42:32

标签: class vba methods

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

任何人都可以a)提供我可以看到的代码来复制或b)告诉我这是什么叫做,甚至可能在有用的方向上推动我?

正如我所知,在没有提供代码的情况下要求代码让我看起来像个鸡巴,请考虑以下伪代码。我知道这很可怕,但它可能对我有任何意义:

main ---------------------------------------------- --------------------------

Dim obj as class1
set obj = new class1

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

'A1:B5 put into modRange then given borders

class1 ---------------------------------------------- --------------------------

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”的类(我可能不会)作为这个1类对象的一部分,它是否会与Range对象的Borders部分冲突,并且它具有相似的名称?或者私人范围会保留一天吗?

(.Borders.Add / Remove对于我所知道的课程来说有点荒谬,我真的只是在语法之后 - 诚实)

2 个答案:

答案 0 :(得分:6)

要拥有对象的复杂属性,需要创建一个新类,然后在父类中创建该类的实例。所以,如果你想要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

...

然后在Class1中,你会有这样的东西:

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 = ...
...

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

你也需要错误检查和验证代码 - 我把它们留下来以保持示例简短。

答案 1 :(得分:3)

另一种解决方案就是让我回归以使其可以链接。

类模块:CChaining

使用目标和边框的函数返回Me以启用链接。使用Subs进行添加和删除以及#34;完成"链条。

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

在模块中测试类

Sub testing()
    Dim obj As New CChaining
    obj.Target(Range("A1:B5")).Borders.Add
    'now the target and property (Borders) is set and you could do this
    'obj.Remove
End Sub

非常好......嗯,有了它,就可以像其他语言一样构建一个库(javascript> jQuery),以便更轻松地使用Excel VBA。