对象变量或块变量未设置访问vba [重复]

Posted

技术标签:

【中文标题】对象变量或块变量未设置访问vba [重复]【英文标题】:Object variable or With block variable not set Access vba [duplicate] 【发布时间】:2017-06-08 15:00:36 【问题描述】:

我正在使用 Access 中的几个表,CTOLCTOL_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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

返回属性时未设置错误对象变量或块变量

VB6中的“对象变量或块变量未设置”运行时错误

有时在 Outlook VBA 中获取“对象变量或未设置块变量”

VBA Excel 错误对象变量或未设置块变量

Excel VBA“对象变量或未设置块变量”

EXCEL VBA - 对象变量或未设置块变量