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 进行完整的同行评审。
我正在尝试使用面向对象的概念在 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 进行完整的同行评审。