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

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

这里是我的工厂模块(我命名它造物主 )的一个例子:

 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”: 对象variables或未设置块variables

该debugging突出显示了CreateTool函数的CreateTool.InitiateProperties (ToolID)行。

我知道,这通常发生在有人正在设置一个对象的值,而不使用关键字Set但似乎并不是我的情况。

任何帮助,build议来解决这个问题将不胜感激!

谢谢。

可能不是你的错误的原因,但是这个:

 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正确识别的那样 ,您正在访问InitiateProperties的单位化对象pAttributes – 这很可能是您的问题的原因。

强烈推荐另一种方法 – 如果你来自Java,你知道在一个构造函数中做的工作是糟糕的devise…这同样适用于VBA。

让你的代码正常工作,并将其全部发布在Code Review Stack Exchange上,以获得完整的同行评审。