2

我正在寻找一种“链接类方法”的方法,例如 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

类 1------------------------------------------------ ----------------------

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 部分冲突以及它具有相似的名称?还是 Private 范围可以挽救局面?

(.Borders.Add/Remove 作为一个我知道的类有点荒谬,我真的只在语法之后 - 老实说)

4

2 回答 2

6

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

'- 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使用的。将这些值创建为属性可以让您将这些调用链接在一起。

您还需要错误检查和验证代码 - 我将它们省略以保持示例简短。

于 2013-07-20T18:14:34.493 回答
4

另一个解决方案是只返回 Me 以使其可链接。

课程模块:CChaining

使用返回 Me 的 Target 和 Borders 函数来启用链接。使用 Subs for Add 和 Remove 来“完成”链。

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 变得更加容易。

于 2014-02-11T15:10:15.347 回答