从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误

Posted

技术标签:

【中文标题】从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误【英文标题】:Error "Object required" when running working parameterised Access SQL query (INSERT INTO) from Excel VBA 【发布时间】:2015-08-03 02:43:39 【问题描述】:

我正在从 Excel 文件运行一些 VBA,以在 Excel 中进行数据操作后更新 Access 数据库。它通过 DAO 链接创建和执行 SQL 行。有时要输入的数据包含破坏 SQL 的字符(例如,INSERT INTO 语句的值中的撇号),因此捕获参数化查询语句的错误会尝试进行这些更改。

清除旧错误后,查询语句在运行时返回错误“需要对象”,但它确实有效(数据库以正确的方式修改)。问题是:为什么它返回这个错误,我做错了什么?这可能是个问题吗?

初始错误的代码摘要:

Dim TableName As String, FieldString As String
Dim strSQL As String, valstring As String
Dim NewTableRef As Range
Dim rs As DAO.Recordset, ws As DAO.Workspace, db As DAO.Database

' Fieldstring is a string containing all field names for the table to be changed'
' TableName is the table to be changed'
' Connecting to database and setting ranges done previously'
' strSQL is initially set by the type of change to make'

' modify the recordset'
On Error Resume Next
db.Execute (strSQL)

If Err <> 0 Then
    ' Only an issue for inputs to Table1'
    If TableName = "Table1" Then
        ' try it with parameters'
        strSQL = "PARAMETERS @var1 TEXT, @var2 TEXT, @var3 TEXT, @var4 TEXT, @var5 TEXT;" _
            & "INSERT INTO " & TableName & " (" & FieldString & ") " & " VALUES (@var1,@var2,@var3,@var4,@var5);"

        Set qdf = db.CreateQueryDef("", strSQL)

        qdf!var1 = NewTableRef.Offset(Row - NewTableRef.Row, 1).Value
        qdf!var2 = NewTableRef.Offset(Row - NewTableRef.Row, 2).Value
        qdf!var3 = NewTableRef.Offset(Row - NewTableRef.Row, 3).Value
        qdf!var4 = NewTableRef.Offset(Row - NewTableRef.Row, 4).Value
        qdf!var5 = NewTableRef.Offset(Row - NewTableRef.Row, 5).Value

        Err.Clear
        Error.Clear

        qdf.Execute

        If Err <> 0 Then
            With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
                .Columns(1).Offset(ErrNum).Value = Now()
                .Columns(2).Offset(ErrNum).Value = ii
                .Columns(3).Offset(ErrNum).Value = TableName
                .Columns(4).Offset(ErrNum).Value = PKey
                .Columns(5).Offset(ErrNum).Value = Error(Err)
                .Columns(6).Offset(ErrNum).Value = valstring
                ErrNum = ErrNum + 1
                Debug.Print ErrNum
            End With
        End If


    Else

        ' write error has occurred'
        ' log this error'
        With ThisWorkbook.Sheets("DB Error Log").Range("Error_Log")
            .Columns(1).Offset(ErrNum).Value = Now()
            .Columns(2).Offset(ErrNum).Value = ii
            .Columns(3).Offset(ErrNum).Value = TableName
            .Columns(4).Offset(ErrNum).Value = PKey
            .Columns(5).Offset(ErrNum).Value = Error(Err)
            .Columns(6).Offset(ErrNum).Value = valstring
            ErrNum = ErrNum + 1
            Debug.Print ErrNum
        End With

        Error.Clear
        Err.Clear

    End If

End If
On Error GoTo 0

【问题讨论】:

Error 应该是什么?当你有一个On Error Resume Next 语句时,你如何得到错误? @Rory 理想情况下第二次不会出现错误 - 它只会运行。检查“if Err 0”时出现错误。它应该等于0,因为我在执行查询之前清除它。 span> 并没有真正回答问题。你的Error.Clear 行中的Error 是什么?当代码抑制它们时,您如何获得任何 i>错误消息? span> @Rory - 清除的错误是 3075 -“语法错误(查询表达式''成员领导的安全性'中缺少运算符。”这是导致发布的代码部分被调用的错误(即第一个“if err 0 then”)。清除此错误后,第二个(意外)错误是 424 -“需要对象”。我收到一条错误消息,因为我检查错误并将任何错误写入错误日志。它不是暂停代码运行的错误消息。 我想我还是不清楚。您认为代码中的Error 是什么?它不是内置的 VBA 对象,那么它是什么? (注意我不是在问你遇到了什么错误,我是在问你认为这条线实际上做了什么:Error.Clear 【参考方案1】:

Error是一个从错误号返回错误描述的函数;它不是一个对象,所以你不能使用Error.Clear - 从你的代码中删除它。

【讨论】:

以上是关于从 Excel VBA 运行工作参数化 Access SQL 查询 (INSERT INTO) 时出现“需要对象”错误的主要内容,如果未能解决你的问题,请参考以下文章

从 Excel VBA 运行嵌套的 Access SQL 查询

从 C# 运行 Excel 宏:从 VBA 捕获运行时错误

Access(VBA)从Excel工作簿打开并运行宏

如何从 Excel VBA 运行 SSIS 包

VBA/SQL 参数化查询 - 字段列表中的未知列

用Excel使用VBA时显示运行错误5,错误调用参数,程序特别简单,如图,求问哪里出错了