【问题标题】:"Invalid procedure Call or Argument" when importing access query into excel table将访问查询导入 Excel 表时出现“无效的过程调用或参数”
【发布时间】:2017-07-08 19:02:57
【问题描述】:

我有一个 Excel 工作簿,其中包含链接到 Excel 表的数据透视表和图表。我想创建一个按钮,当按下该按钮时,它会删除表中的任何数据,并将其替换为访问数据库中保存的查询中的更新数据。我已经编写了以下代码,但是当我运行该过程时出现“无效的过程调用或参数”错误。有谁知道我哪里出错了?

   'button on excel form runs procedure to remove current data in table then 
   'import data from query in MS access database

Sub ImportData()
    Call CleanTheTable("MMPres_MainData", "MainData")
    Call ImportAccessData("qry_MMPres_Main", "MMPres_MainData", "MainData"
End Sub   

   'procedure finds database file and imports query into excel table

Sub ImportAccessData(qry As String, sht As String, tbl As String)

On Error GoTo ErrorHandler

    Const dbLoc As String = "D:\AccessPractice\CTDB\CardiothoracicDB_v2_Current.accdb"
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim bk As Workbook
    Dim Wsht As Worksheet

    Set bk = ActiveWorkbook
    Set Wsht = bk.Worksheets(sht)
    Set db = DBEngine.OpenDatabase(dbLoc)
    Set rs = db.OpenRecordset(qry, dbOpenSnapshot)

    Wsht.ListObjects(tbl).Range("A1").CopyFromRecordset (rs)

    rs.Close
    Set rs = Nothing
    db.Close
    Set db = Nothing
    Set Wsht = Nothing
    Set bk = Nothing
    Exit Sub

ErrorHandler:
    Application.StatusBar = ""
    MsgBox ("Error: " & Err.Number & " " & Err.Description)
    rs.Close
    Set rs = Nothing
    db.Close
    Set db = Nothing
    Set Wsht = Nothing
    Set bk = Nothing

End Sub

【问题讨论】:

  • 尝试注释掉行,看看哪一行会引发错误。
  • 你的参考文献中是否引用了 DAO?
  • (应该是Microsoft Office 16.0 Access database engine object,其中16.0是你的office版本。
  • 这只是一个标准的调试练习。注释掉行只是一种技术,但更有用的技术(如局部变量观察、断点和逐行执行)可能会更有帮助,而无需更改现有代码。调用Debug.Print 来跟踪执行并将值显示到即时窗口也很有帮助且非常有效。

标签: vba excel ms-access


【解决方案1】:

假设你已经为DAO 设置了必要的库引用,你得到的错误就在这一行:

Wsht.ListObjects(tbl).Range("A1").CopyFromRecordset (rs)

改成这样:

Wsht.ListObjects(tbl).Range(2, 1).CopyFromRecordset rs

也可以:

Wsht.ListObjects(tbl).HeaderRowRange.Offset(1).CopyFromRecordset rs

总结:

1- 去掉(rs)周围的括号

2- 不要覆盖表头(即第 1 行),从第二行开始复制记录集。

3- ListObject 的方法 Range 有点混乱,它返回表格的整个范围,但不能直接提供 "A1-style" 引用,它的作用更大像Cells 工作表方法。

【讨论】:

  • @VkBk 不客气。请考虑accepting answers,它可以帮助您解决问题。谢谢。
猜你喜欢
  • 2016-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2011-01-18
  • 1970-01-01
  • 2020-09-03
  • 1970-01-01
相关资源
最近更新 更多