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上,以获得完整的同行评审。