gpt4 book ai didi

vba - VBA 中的构造函数 - 运行时错误 91 "Object variable not set"

转载 作者:行者123 更新时间:2023-12-03 02:38:24 27 4
gpt4 key购买 nike

我正在尝试使用面向对象的概念在 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”:未设置对象变量或 block 变量

调试突出显示了我的 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 相当于在构造函数中执行工作,即访问数据库和其他副作用来构造对象。

@Jules correctly identified ,您正在访问 InitiateProperties 内的统一对象 pAttributes - 这很可能是导致问题的原因。

强烈推荐另一种方法 - 如果您来自 Java,您知道在构造函数中进行工作是糟糕的设计...这同样适用于 VBA。

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

关于vba - VBA 中的构造函数 - 运行时错误 91 "Object variable not set",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34865442/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com