修改现有的VBA类

我想知道是否有一些方法来添加自己的方法/属性到现有的VBA类(如范围图表等)。

一个例子:我想当前的VBA类工作表有一个由我自己完成的具体方法,如:

'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 

谢谢!

在VBA中没有直接的方法。

最好你可以做的是创build一个“包装”类,它有一个私人的工作表成员,并通过一个Sheet属性公开。 将你的“扩展”方法添加到类,让他们在m_sheet上操作。

通过创build它的实例并将工作表对象分配给其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 

testing子:

 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属性(但我没有testing过)

传统面向对象编程语言中所谓的“ 扩展 ”方法。

请参阅MSDN : 扩展方法(Visual Basic)

对于传统的Visual Basic for Applications(VBA),AFAIK不支持/可用。

下面是一个在MSDN源代码中使用Visual Basic .Net(VB.Net)进行扩展的例子。

第1步。声明扩展方法像这样…

在这里输入图像描述

第2步。像这样的电话扩展方法…

在这里输入图像说明