【问题标题】:How to retrieve data from access database(.accdb) into excel using vba如何使用 vba 将 access 数据库(.accdb)中的数据检索到 excel 中
【发布时间】:2017-01-10 03:52:15
【问题描述】:

我正在处理 Excel VBA 宏,我想从 MS Access 数据库(.accdb 文件)中检索数据。

我尝试使用下面的连接字符串,它会抛出运行时错误“438”

   Dim cn As Object, rs As Object,DBFullName As String,Target As Range
   DBFullName = "D:\Tool_Database\Tool_Database.accdb"
   Set Target = Sheets("Sheet1").Range("A1")
   Set cn = CreateObject("ADODB.Connection")
   cn.Open "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & DBFullName & ";"

   Set rs = CreateObject("ADODB.Recordset")
   rs.Open "SELECT * FROM test", cn, , , adCmdText

  For int i = 0 To rs.Fields.Count - 1
  Target.Offset(1, i).Value = rs.Fields(i).Name
  Next
  Target.Offset(1, 0).CopyFromRecordset rs
  rs.Close
  Set rs = Nothing
  cn.Close
  Set cn = Nothing

请帮我解决错误

【问题讨论】:

  • 你说它是一个.accdb 文件-那你为什么在你的连接字符串中使用.mdb 扩展? DBFullName = "D:\Tool_Database\Tool_Database.mdb"??
  • .mdb 是一个错字它是 .accdb

标签: excel ms-access vba adodb


【解决方案1】:

我尝试使用下面的连接字符串,它会抛出运行时错误“438”

Run-time error: '438' 表示Object doesn't support this property or method..

您收到该错误是因为您将VB.NetVBA 混合使用

这个

For int i = 0 To rs.Fields.Count - 1

应该是

For i = 0 To rs.Fields.Count - 1

除此之外,我猜DBFullName = "D:\Tool_Database\Tool_Database.mdb" 是您使用.Accdb 时的拼写错误?

【讨论】:

  • 是的 .mdb 是一个错字。如何解决此错误我需要添加任何参考
  • 我尝试了上面的代码,它对我拥有的数据库运行良好。我怀疑数据库中的数据。试试这个记录集打开命令:rs.Open "SELECT * FROM Books", cn, adOpenStatic, adLockReadOnly
  • @Siddharth Rout:我不是 user2514925
  • @BalasubramaniyanRamadoss:我当时不明白你的评论:)
  • @Siddharth Rout:在使用不同的数据库尝试上述代码时,我没有收到任何错误。
【解决方案2】:

这应该为你做。如果您不想应用过滤器,请删除 WHERE 子句。

另外,设置一个引用: Microsoft ActiveX 数据对象 2.8 库

Sub Select_From_Access()
    Dim cn As Object, rs As Object
    Dim intColIndex As Integer
    Dim DBFullName As String
    Dim TargetRange As Range

    DBFullName = "C:\Users\Ryan\Desktop\Nwind_Sample.mdb"

    'On Error GoTo Whoa

    Application.ScreenUpdating = False

    Set TargetRange = Sheets("Select").Range("A1")

    Set cn = CreateObject("ADODB.Connection")
    cn.Open "Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & DBFullName & ";"

    Set rs = CreateObject("ADODB.Recordset")
    rs.Open "SELECT * FROM [OrderDetails] WHERE [OrderID] = 10248", cn, , , adCmdText

    ' Write the field names
    For intColIndex = 0 To rs.Fields.Count - 1
    TargetRange.Offset(1, intColIndex).Value = rs.Fields(intColIndex).Name
    Next

    ' Write recordset
    TargetRange.Offset(1, 0).CopyFromRecordset rs

    Application.ScreenUpdating = True
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    cn.Close
    Set cn = Nothing
    On Error GoTo 0
    Exit Sub

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多