VBA声明对象后调用类函数失效,报错438求助
问题原因与解决方案
这个错误的核心原因是调用方法时多余的括号导致参数传递方式异常:
- 当明确声明
Accounts As CAccounts时,VBA会严格遵循对象的方法签名处理调用。add_account方法需要接收CAccount对象的引用,但Accounts.add_account (accnt)里的括号会强制将accnt这个对象转换为值传递(相当于尝试获取对象的默认属性),如果CAccount类未定义默认属性,就会触发「运行时错误'438':对象不支持该属性或方法」。 - 当
Accounts为Variant类型时,VBA会启用后期绑定,此时括号会被自动忽略,参数以引用方式传递,因此代码能正常运行。
修复方案
只需去掉调用方法时的括号:
Sub main() Dim Accounts As CAccounts Set Accounts = New CAccounts Set accnt = New CAccount Accounts.add_account accnt ' 移除多余括号 End sub
如果习惯使用括号,也可以加上Call关键字:
Call Accounts.add_account(accnt)
补充说明
在VBA中:
- 调用Sub过程或Function方法时,若不使用
Call关键字,参数不需要加括号;若加括号,会将参数从引用传递改为值传递。 - 只有需要获取Function的返回值时,才需要用括号包裹参数,比如
result = Accounts.add_account(accnt)(不过此处add_account无返回值,更适合定义为Sub过程)。
内容的提问来源于stack exchange,提问作者Christopher
相关产品推荐
相关产品推荐

