Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 修改现有的VBA类_Excel_Vba_Class - Fatal编程技术网

Excel 修改现有的VBA类

Excel 修改现有的VBA类,excel,vba,class,Excel,Vba,Class,我想知道是否有办法将您自己的方法/属性添加到现有的VBA类(如范围、图表等) 例如: 我希望当前的VBA类工作表有一个自己完成的特定方法,例如: 'Worksheet methods Public Sub LookFor (ByVal Value as String) 'My code End Sub 然后我可以从任何声明的工作表类调用此函数 在MyClass类中: 'MyClass members Private pWS1 as Worksheet Private pWS2 as W

我想知道是否有办法将您自己的方法/属性添加到现有的VBA类(如范围、图表等)

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

'Worksheet methods
Public Sub LookFor (ByVal Value as String)
    'My code
End Sub
然后我可以从任何声明的工作表类调用此函数

在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    

谢谢

在传统的面向对象编程语言中,您所寻找的方法被称为“扩展”

请参见MSDN

您好,传统的Visual Basic for Applications(VBA)不支持/不提供您要查找的内容。 下面是一个从MSDN源代码在Visual Basic.Net(VB.Net)中执行扩展方法的示例

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

第二步。像这样调用扩展方法。。。
在VBA中没有直接的方法来实现这一点

您所能做的最好的事情是创建一个具有私有工作表成员的“包装器”类,并通过一个Sheet属性公开它。将“扩展”方法添加到类中,并让它们在m_工作表上操作

通过创建类的实例并将工作表对象指定给其工作表属性来初始化类

您可以直接在对象上调用“扩展”方法,以及通过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
子测试仪()
我的单子一样暗
Set sht=新的MySheet
设置sht.SHET=ActiveSheet

亲爱的蒂姆,谢谢你的快速回复。我已经考虑过了。但这种方法唯一重要的一点是,如果我需要声明具有不同名称和用途(而不是数组)的类工作表的多个项,那么我假设为每个项编写相同的代码会很麻烦。最后,因为每个项目都有不同的目的,但它们都有一个共同的功能(我想要实现的功能)。。。我将继续寻找更多的方法来实现这一点……如果您创建一个“工厂”函数来返回类的初始化实例,那么就没有比使用常规工作表对象更多的代码(作为代码行)。这是VBA中唯一可用的方法。