修改现有的VBA类

时间:2017-03-04 00:02:46

标签: excel vba class

我想知道是否有某种方法可以将自己的方法/属性添加到现有的VBA类(例如 Range Charts 等)。

一个例子: 我希望当前的VBA类 Worksheet 有自己完成的特定方法,例如:

'Worksheet methods
Public Sub LookFor (ByVal Value as String)
    'My code
End Sub

然后我可以从任何声明的Worksheet类调用此函数。

在课程MyClass中:

'MyClass members
Private pWS1 as Worksheet
Private pWS2 as Worksheet
Private pWS3 as Worksheet


'MyClass methods
Private Sub Class_Initialization()
    Set pWS1 = Worksheets("WS1")
    Set pWS2 = Worksheets("WS2")
    Set pWS3 = Worksheets("WS3")
End Sub

Public Sub Example()
    pWS1.LookFor("abc")
    pWS2.LookFor("123")
    pWS3.LookFor("def")
End Sub    

谢谢!

2 个答案:

答案 0 :(得分:2)

在VBA中没有直接的方法。

你能做的最好就是创造一个"包装"具有私有Worksheet成员的类,并通过Sheet属性公开它。添加您的"扩展程序"类的方法,让它们在m_sheet上运行。

通过创建类的实例并将工作表对象分配给其Sheet属性来初始化类。

您可以拨打"分机号码"直接在对象上的方法,以及您通过Sheet属性访问的任何现有方法。

课程MySheet:

Private m_sht As Worksheet


Public Property Set Sheet(ws As Worksheet)
    Set m_sht = ws
End Property

Public Property Get Sheet() As Worksheet
    Set Sheet = m_sht
End Property

Public Property Get CountHellos() As Long
    CountHellos = Application.CountIf(m_sht.Cells, "Hello")
End Property

测试子:

Sub Tester()

    Dim sht As MySheet

    Set sht = New MySheet

    Set sht.Sheet = ActiveSheet

    MsgBox sht.CountHellos '<< "extension" method

    MsgBox sht.Sheet.Rows.Count '<< built-in object property

End Sub

编辑:您可以按照Chip在此处列出的步骤,将Sheet属性设置为您的类的默认属性:http://www.cpearson.com/excel/DefaultMember.aspx

可以让你在使用班级实例时跳过Sheet属性(但我还没有对此进行测试)

答案 1 :(得分:-1)

您正在寻找的是传统面向对象编程语言中的“扩展”方法。

请参阅 MSDN Extension Methods (Visual Basic)

AFAIK,传统的Visual Basic for Applications(VBA)不支持/提供您所需的内容。

以下是从MSDN源代码在Visual Basic .Net(VB.Net)中执行扩展方法的示例。

步骤1.声明扩展方法,如此......

enter image description here

步骤2.调用扩展方法,如此......

enter image description here