VBA 中的构造函数 - 运行时错误 91 "Object variable not set"

Constructor in VBA - Runtime error 91 "Object variable not set"

我正在尝试使用面向对象的概念在 excel VBA 中编写一些代码。因此我想用构造函数初始化我的对象,就像我们通常在 Java 中所做的那样。但是我发现 VBA 中提供的默认 Class_Initialize() Sub 不带参数。经过一番搜索,我发现这个 Question 的答案提出了一个很好的替代方案。

这是我的工厂模块的示例(我将其命名为 Creator):

Public Function CreateTool(ToolID As Integer) As cTool
    Set CreateTool = New cTool
    CreateTool.InitiateProperties (ToolID)     '<= runtime error 91 here
End Function

classcTool:

Private pToolID As Integer
Private pAttributes As ADODB.Recordset 
Private pCnn As ADODB.Connection

Public Sub InitiateProperties(ToolID As Integer)
    Dim sSQL As String
    Set pCnn = connectToDB()     'A function that returns a connection to the main DB
    pToolID = ToolID
    sSQL = "SELECT Tool_ID, Status, Type, Tool_Number " _
                 & "FROM Tool  WHERE Tool_ID = " & pToolID
    pAttributes.Open sSQL, pCnn, adOpenKeyset, adLockOptimistic, adCmdText
End Sub

这是我调用构造函数的方式:

Dim tool As cTool
Set tool = Creator.CreateTool(id)

我的问题是,当我 运行 代码时,出现以下错误:

运行-Time error '91' : Object Variable or With Block Variable not Set

调试突出显示了我的 CreateTool 函数的 CreateTool.InitiateProperties (ToolID) 行。

我知道这通常发生在有人不使用关键字 Set 为对象设置值时,但我的情况似乎并非如此。

任何解决此问题的帮助和建议将不胜感激!

谢谢。

可能不是您出错的原因,但这是:

Public Function CreateTool(ToolID As Integer) As cTool
    Set CreateTool = New cTool
    CreateTool.InitiateProperties (ToolID)     '<= runtime error 91 here
End Function

由于多种原因存在问题。考虑:

Public Function CreateTool(ByVal ToolID As Integer) As cTool
    Dim result As cTool
    Set result = New cTool
    result.InitiateProperties ToolID
    Set CreateTool = result
End Function

现在,看看你的代码的其余部分,你正在做 VBA 等同于 在构造函数 中做的工作,即访问数据库和其他 side-effects 构建您的对象。

作为 ,您正在访问 InitiateProperties 内的单元化对象 pAttributes - 这很可能是您遇到问题的原因。

强烈推荐另一种方法——如果你来自Java,你知道在构造函数中工作是糟糕的设计...同样适用于 VBA.

让您的代码正常工作,post 全部提交 Code Review Stack Exchange 进行完整的同行评审。