我正在寻找一种'链类方法'的方法,例如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对于我所知道的课程来说有点荒谬,我真的只是在语法之后 - 诚实)
答案 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)
另一种解决方案就是让我回归以使其可以链接。
使用目标和边框的函数返回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。