对象变量或块变量未设置访问vba [重复]
Posted
技术标签:
【中文标题】对象变量或块变量未设置访问vba [重复]【英文标题】:Object variable or With block variable not set Access vba [duplicate] 【发布时间】:2017-06-08 15:00:36 【问题描述】:我正在使用 Access 中的几个表,CTOL 和 CTOL_Asbuilt。我正在尝试运行查询以使用 VBA 代码将这两个表连接在一起。我在 Access 中运行了查询,它可以工作。我正在为数据库库使用 DAO 从本地 Access 数据库中检索数据(代码与数据库位于同一数据库项目中),而且我是 VBA Access 脚本的新手。
SELECT CTOL.ID, CTOL.BOM_PART_NAME, CTOL.CII, CTOL.[PART FIND NO], CTOL.CSN,
CTOL.AFS, CTOL.EQP_POS_CD, CTOL.LCN, CTOL.POS_CT, CTOL.SERIAL_NO,
CTOL.PART_NO_LLP, [CTOL_Asbuilt].[PART-SN], [CTOL_Asbuilt].[PART-ATA-NO],
[CTOL_PW-E750207_Asbuilt].[PW-PART-NO]
FROM CTOL LEFT JOIN [CTOL_Asbuilt] ON CTOL.[PART FIND NO] = [CTOL_Asbuilt].[PART-ATA-NO];
这是下面的代码:
Option Compare Database
Option Explicit
'Const adOpenStatic = 3
'Const adLockOptimistic = 3
Function queryDatabase()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim rsQuery As DAO.Recordset
Dim part_find_no() As String
Dim eqp_pos() As Integer
'Dim strSQL As String
Dim i As Integer
Dim j As Integer
'Set objConnection = CurrentDb.OpenRecordset("CTOL")
Set db = CurrentDb
Set rsQuery = db.OpenRecordset("SicrProcess", dbOpenDynaset)
rs.Close
db.Close
Set rs = Nothing
Set db = Nothing
End Function
当我使用调用该函数的宏运行此代码时,出现以下错误:
运行时错误“91”:
对象变量或未设置块变量
我正在尝试使用带有查询的代码来循环遍历两个字段并在 PART FIND NO 条目与最后一个条目匹配时增加 EQP_POS_CD 字段的值(否则,它只会移动到下一条记录,直到到达结果集的末尾)。我想测试运行此查询以确保代码检索通过在 Access 中手动运行查询输出的结果。
您能帮我解决这个错误,以便我可以运行我的代码来检索数据吗?谢谢!
【问题讨论】:
您关闭了rs
,但只打开了rsQuery
。简单的错字。
【参考方案1】:
rs.Close
您无法关闭未打开的内容。也许您的意思是rsQuery.Close
?
【讨论】:
已修复。谢谢。但是当我运行它时,它现在什么也没做。 @evvdogg 它关闭了记录集,你期待什么? FWIW 在对其中的数据进行任何有用的操作之前,您正在打开记录集并关闭它。为什么你甚至需要一个记录集? 确实,您不会尝试循环遍历记录集并增加值。 我很抱歉。我试图一步一步地解决这个问题,并希望在每一步都对其进行测试,这样在尝试运行我的代码后就不会出现大量错误。我的目标是测试运行查询,但我想我需要对它做一些事情才能生成输出。请耐心等待,我对数据库脚本不是很熟悉。【参考方案2】:打开一个记录集并循环遍历记录。
Sub queryDatabase()
On Error GoTo ErrProc
Dim db As DAO.Database
Set db = CurrentDb
Dim qdf As DAO.QueryDef
Set qdf = db.QueryDefs("SicrProcess") 'set your query name here
Dim rs As DAO.Recordset
Set rs = qdf.OpenRecordset(dbOpenDynaset)
Dim part_find_no() As String
Dim eqp_pos() As Integer, i As Integer
If rs.EOF Then GoTo Leave
rs.MoveLast
rs.MoveFirst
For i = 1 To rs.RecordCount
'...
'Do work here
'...
rs.MoveNext
Next i
Leave:
On Error Resume Next
rs.Close
Set rs = Nothing
qdf.Close
Set qdf = Nothing
Set db = Nothing
On Error GoTo 0
Exit Sub
ErrProc:
MsgBox Err.Description, vbCritical
Resume Leave
End Sub
【讨论】:
谢谢。这是非常有帮助的,也是我开始的好地方。我还需要在 Leave 块中使用 db.close 吗?如果我运行它,它会遍历记录还是需要添加更多?我希望最终结果循环遍历记录,然后增加 eqp_pos_no。我需要将 PART FIND NO 和 EQP_POS_CD 字段都加载到数组中以循环遍历它们并增加 EQP_POS_CD,其中 PART FIND NO 与前一个 PART FIND NO 匹配。我将如何将它们加载到数组中然后循环? 另外,它是子还是函数有关系吗?我把它变成了一个函数,因为宏只能调用函数。不过,我不需要调用它的特定方式,因此调用 sub 也可以。我想知道哪个更有利或更方便。感谢您的反馈!以上是关于对象变量或块变量未设置访问vba [重复]的主要内容,如果未能解决你的问题,请参考以下文章