Excel VBA自定义类模块方法开发与对象引用问题咨询
VBA自定义类链式调用实现方法
要实现对象.属性.自定义方法的链式调用,核心是通过自定义包装类持有原生对象的引用——VBA不支持给内置Office对象直接追加扩展方法,必须通过自定义类做中转包装。
第一步:修改Class2(包装类)代码
在类里声明私有变量存储传入的目标Workbooks对象,新增绑定方法关联原对象,再实现翻倍计算逻辑:
' Class2 模块代码 Private targetWorkbooks As Workbooks ' 绑定需要处理的原生Workbooks集合对象 Public Sub BindSource(obj As Workbooks) Set targetWorkbooks = obj End Sub ' 返回Count值翻倍的结果 Public Function DoubleResult() As Long ' 直接调用已绑定对象的属性计算 DoubleResult = targetWorkbooks.Count * 2 End Function
注意:返回值类型请用Long替代Integer,避免工作簿数量较多时出现数值溢出问题
第二步:修改Class1代码
原来的属性直接返回原生Workbooks对象,现在调整为返回绑定了源对象的Class2实例:
' Class1 模块代码 Public Property Get MyObject() As Class2 ' 初始化包装类实例 Dim wbWrapper As New Class2 ' 将原生Workbooks对象传入包装类完成绑定 wbWrapper.BindSource Application.Workbooks ' 返回包装类实例,支持后续链式调用自定义方法 Set MyObject = wbWrapper End Property
第三步:测试调用
标准模块里的测试代码可直接按你期望的链式形式编写:
' Module1 模块代码 Function test() Dim clstest As New Class1 Debug.Print "Doubled Result is: " & clstest.MyObject.DoubleResult End Function
运行后立即窗口输出结果为:
Doubled Result is: 2
说明
- 你之前的写法直接返回Office内置的
Workbooks对象,这类内置对象的方法、属性都是预先定义好的,VBA没有动态追加方法的能力,所以无法直接在原生对象后调用你自定义的DoubleResult方法。 - 如果后续需要给
MyObject追加其他自定义逻辑,直接在Class2里新增对应方法即可,所有方法都可以通过targetWorkbooks访问到原始的工作簿集合对象。
内容的提问来源于stack exchange,提问作者AM Hrabikk
相关产品推荐
相关产品推荐

