VBA类模块调用字典出现运行时错误91及编译错误求助
解决VBA类模块中Scripting.Dictionary的运行时错误91问题
咱们一步步拆解你的问题,你遇到的错误主要来自两个地方:类模块里对象未正确初始化,以及主模块里的语法错误。
一、类模块的核心问题修正
你的类模块有两个关键错误:
- 事件过程名拼写错误:
class_initalize少了一个字母i,VBA的初始化事件必须严格写成Class_Initialize(注意大小写和完整拼写),否则这个过程根本不会被触发。 - Dictionary对象未实例化:你声明了
subjectData As Scripting.Dictionary,但没有用Set语句创建这个对象的实例,直接用With subjectData会因为对象是Nothing而抛出错误91。
修正后的类模块代码:
' 若未引用Microsoft Scripting Runtime,可改用CreateObject方式实例化 Public subjectData As Scripting.Dictionary Private Sub Class_Initialize() ' 先实例化Dictionary对象 Set subjectData = New Scripting.Dictionary ' 再添加预设键值对 With subjectData .Add "name", "" .Add "inn", "" .Add "ogrn", "" .Add "address", "" End With End Sub
补充:如果你的项目没有提前引用
Microsoft Scripting Runtime,可以把实例化语句改成Set subjectData = CreateObject("Scripting.Dictionary"),这样无需手动添加引用也能正常运行。
二、主模块的错误修正
你的主模块有两个小问题需要调整:
- 键名未加引号:
client.subjectData.Item(name)里的name是字符串类型的键,必须用双引号括起来写成"name",否则VBA会把name当成未定义的变量,引发“变量未定义”的编译错误。 - 错误的实例化语句:
Set client = LegalSubject是错误语法,正确实例化类的方式是Set client = New LegalSubject(不过Dim client As New LegalSubject已经会在第一次使用时自动实例化类,这个语句可以省略,但分开写代码逻辑更清晰)。
修正后的主模块代码:
Option Explicit Private Sub Document_New() Dim client As LegalSubject ' 显式实例化类对象 Set client = New LegalSubject ' 正确访问Dictionary的键(注意键名加双引号) client.subjectData.Item("name") = "Microsoft corporation" ' 也可以简化写成:client.subjectData("name") = "Microsoft corporation" End Sub
额外优化建议
为了让类的封装性更好,你可以把subjectData声明为Private,然后通过类的属性来访问这些键,而不是直接暴露Dictionary对象。比如在类模块里添加:
Private subjectData As Scripting.Dictionary ' 提供name属性的读写接口 Public Property Get Name() As String Name = subjectData("name") End Property Public Property Let Name(ByVal newValue As String) subjectData("name") = newValue End Property ' 同理可添加Inn、Ogrn、Address的属性
这样主模块里就可以直接写client.Name = "Microsoft corporation",代码更易读,也更符合面向对象的封装原则。
内容的提问来源于stack exchange,提问作者Igor Cheglakov
相关产品推荐
相关产品推荐

