VBA TypeName函数对自定义类行为不一致:旧代码可用新代码报错
问题分析与解决
核心原因:自定义类 vs 用户自定义类型(UDT)的区别
微软文档中提到的「TypeName函数参数不能是用户自定义类型」,指的是用Type...End Type定义的用户自定义类型(UDT),而非VBA中通过「类模块(Class Module)」创建的自定义类实例。
你的旧项目能正常运行,是因为Dimension_Compound是基于类模块创建的自动化类实例——这类实例本质是COM对象,属于Variant可以容纳的合法类型,TypeName函数能够识别并返回类名。
而新项目报错,大概率是因为你把PLMShape定义成了UDT(比如用Type PLMShape ... End Type语法),而非类模块。UDT不属于自动化对象范畴,传递给TypeName时就会触发「参数数量错误或属性赋值无效」的报错。
验证与修复步骤
检查PLMShape的定义类型
打开新项目的VBA编辑器,确认PLMShape是「类模块」(工程资源管理器中显示为Class Module),还是用Type关键字定义的UDT。如果是UDT,删除该定义,插入新的类模块并命名为PLMShape,将原UDT的属性、逻辑迁移到类模块中。确认类模块的Instancing属性
选中PLMShape类模块,在属性窗口中查看Instancing属性:- 若仅在当前工程内部使用,保持默认的
Private即可; - 若需要跨工程引用,可设置为
PublicNotCreatable。
类模块的实例只要被正确创建并赋值给Variant变量,TypeName就能正常返回类名。
- 若仅在当前工程内部使用,保持默认的
替代方案:使用TypeOf运算符
如果你需要更严谨的类型判断,可直接用TypeOf替代TypeName,它仅适用于对象类型(包括自定义类模块实例和Visio Shape):Select Case True Case TypeOf newShape Is PLMShape ' 处理PLMShape实例 Case TypeOf newShape Is Visio.Shape ' 处理标准Visio Shape End Select
内容的提问来源于stack exchange,提问作者Trashman
相关产品推荐
相关产品推荐

