VBA类模块封装集合通过Key访问报运行时错误13类型不匹配
错误原因
你遇到的类型不匹配错误根源在于Item方法的入参强制声明为Integer类型,只能接收数字索引,当你传入字符串类型的Key时,参数类型校验失败,直接触发运行时错误13。
修复方案
仅需要修改Item访问器的入参类型为Variant即可,原生VBA.Collection的Item参数本身就是Variant类型,同时支持整数索引和字符串Key两种入参:
' 两种写法二选一即可,功能无差异 ' 写法1:用Property Get(更符合集合访问的语义惯例) Public Property Get Item(Index As Variant) As tnpObject Set Item = mtnpsColl.Item(Index) End Property ' 写法2:用Function Public Function Item(Index As Variant) As tnpObject Set Item = mtnpsColl.Item(Index) End Function
常见疑问解答
- Item声明为Function和Property Get的区别:对于这种带参数的只读访问场景,两者运行效果完全一致,仅语义上有差异:
Property Get更偏向于表示这是类的一个可访问属性,Function更偏向于表示这是一个执行后返回结果的操作,集合类的Item访问器惯例上用Property Get更多。 - 额外优化建议:当前你把单个实体的属性(Key、Checked)和集合管理逻辑放在同一个类里,逻辑上是混淆的,建议拆分两个类:一个
tnpItem类只负责存单个项的属性,另一个tnpCollection类专门做集合的增删查管理,避免后续出现单个实例还附带集合的逻辑混乱问题。
内容的提问来源于stack exchange,提问作者SquirrelBait
相关产品推荐
相关产品推荐

