VBA中的构造函数 - 运行时错误91“未设置对象变量”

时间:2016-01-18 22:43:05

标签: excel vba class excel-vba runtime-error

我正在尝试使用面向对象的概念在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

班级 cTool

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)

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

运行时错误'91': 对象变量或未设置块变量

调试会突出显示CreateTool.InitiateProperties (ToolID)功能的CreateTool行。

我知道当有人在不使用关键字Set的情况下为对象设置值时,通常会发生这种情况,但似乎不是我的情况。

非常感谢任何帮助,解决此问题的建议!

感谢。

1 个答案:

答案 0 :(得分:3)

可能不是导致错误的原因,但是:

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等效的在构造函数中工作,即访问数据库和其他副作用来构建对象。

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

强烈推荐另一种方法 - 如果你来自Java,你知道在构造函数中做工作是不好的设计......这同样适用于VBA。< / p>

让您的代码正常运行,并将其全部发布到Code Review Stack Exchange上,以便进行完整的同行评审。