我正在尝试使用面向对象的概念在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
的情况下为对象设置值时,通常会发生这种情况,但似乎不是我的情况。
非常感谢任何帮助,解决此问题的建议!
感谢。
答案 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上,以便进行完整的同行评审。