【问题标题】:Using ADODB to print recordset to an Excel sheet使用 ADODB 将记录集打印到 Excel 工作表
【发布时间】:2017-11-27 19:28:57
【问题描述】:

我正在尝试使用 ADODB 连接从查询创建记录集,然后将该记录集的内容复制到一系列单元格中

下面是我的代码大纲,但我不断收到错误

运行时错误'-2147467259 (80004005)'未指定错误

(我已将我的特定引用替换为所有大写的虚拟引用)

Sub Subroutine()

'establish ADODB connection to retrieve data from TABLE

Dim objConnection As New ADODB.connection
Dim objRecordset As New ADODB.Recordset

With objConnection
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source = MYDATASOURCE" & _
    "Extended Properties = Excel 8.0;HDR = Yes;"
    .Open
End With

'use query to record data to Excel range
Set objRecordset = objConnection.OpenRecordset("Select * From TABLE Where FieldNm = NAME")

With objRecordset
.Open
.MoveFirst

Do Until .EOF
    Worksheets("WORKSHEET").Cells(14, 1) = objRecordset.Fields.Item("FieldNm")
    .MoveNext
Loop

End With

End Sub

调试转到我的With objConnection 块中的.Open。在此之前,我遇到了.MoveNext 方法的问题。

【问题讨论】:

  • 你试过Worksheets("WORKSHEET").Range("A14").CopyFromRecordset objRecordset吗?
  • 我通常是这样操作的:objRecordset.Open sSelectStatement, objConnection
  • 什么是 sSelectStatement?
  • 请提供实际查询,因为这与 Excel 工作簿不兼容:Select * From TABLE Where FieldNm = NAME。此外,将您的 sub 包装在错误处理中以获取特定消息。
  • @Parfait 我的数据在另一个位置的 Excel 表格中,所以 TABLE 是我的范围的名称。我的查询到底是什么与 Excel 不兼容?

标签: vba ado


【解决方案1】:

假设您的 SQL 正确指定了工作表范围,请考虑调整 With...End With 块内外的一些项目。

  • OpenRecordset 是一种 DAO 方法。为 ADO 使用 Recordset.Open
  • 删除第二个.Open 调用
  • 删除With中的记录集名称
  • 向下循环遍历工作表,而不是重新分配相同的单元格
  • 使用错误处理获取更多信息的错误消息以捕获运行时异常

VBA

Sub Subroutine()
On Error Goto ErrHandle

    '...same as above...

    objRecordset.Open "Select * From TABLE Where FieldNm = NAME", objConnection

    With objRecordset
        .MoveLast
        .MoveFirst

        i = 0
        Do Until .EOF
            Worksheets("WORKSHEET").Cells(14 + i, 1) = .Fields("FieldNm")

            i = i + 1
            .MoveNext
        Loop    

        .Close
    End With

    objConnection.Close

ExitHandle:
    Set objRecordset = Nothing
    Set objConnection = Nothing
    Exit Sub

ErrHandle:
    Msgbox Err.Number & " - " & Err.Description, vbCritical, "RUNTIME ERROR"
    Resume ExitHandle
End Sub

【讨论】:

  • 如果FieldNm 是非数字字段,您可能还需要在值周围使用撇号,即Select * From TABLE Where FieldNm = 'NAME'。
  • 确实如此。 OP 似乎建议查询没问题,SQL 可能是伪代码占位符。
  • 当他们这样做时,很难帮助他们。如果他们只是将字母数字字符更改为其他字母数字字符,将数字更改为其他数字,并且保留所有特殊字符不变,从而混淆数据,那就容易多了。
  • 感谢 YowE3K,这是个好主意。下次我会这样做以尝试保留类型
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-08
相关资源
最近更新 更多