2

我正在尝试创建一个宏,它会定期将 Excel 中的 25,000 - 35,000 行移动到 Access 数据库中。据我了解,如果我在使用宏的人拥有不同版本的 Excel 和 Access(我碰巧使用的是 2007)的环境中工作,我最好使用后期绑定,因为它避免了不同参考的问题和版本等 - 一旦它起作用,它就会起作用(即使它更慢)。

我正在尝试让以下代码在 Excel VBA 中工作:

Sub TransferToDB()
Dim acApp As Object

ssheet = "C:\Documents and Settings\yk\Desktop\Open Invoice Summary 322 - 2012-07-17.xlsx"
ssrange = "AllData!A1:M28323"

Set acApp = CreateObject("Access.Application")
    acApp.OpenCurrentDatabase ("C:\Documents and Settings\yk\Desktop\Open Invoice Summary.accdb")
    acApp.Visible = True
    acApp.UserControl = True
    DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, OpenInvoices, ssheet, True, ssrange
    acApp.CloseCurrentDatabase
    acApp.Quit
Set acApp = Nothing


End Sub

当宏到达 DoCmd.TransferSpreadsheet 行时,它会因错误而停止:

运行时错误 424:

所需对象

Excel 中的此例程从另一个例程调用,该例程从大型工作簿中的许多工作表中收集信息,并将其全部转储到该工作簿中名为“AllData”的工作表中。我一直在网上看到对此 DoCmd.TransferSpreadsheet 方法的引用,但我似乎找不到任何有效的剪切和粘贴代码......

  1. 为什么程序在那个时候总是崩溃?
  2. 甚至可以在不使用 ADO 或 DAO 的情况下将日期从 Excel 传输到 Access?
  3. 后期绑定确实可以防止问题,还是使用 ADO 更好?

谢谢 - 非常感谢您的帮助!

4

3 回答 3

3

这感觉有点明显,但我相信您的错误消息的实际原因是:

DoCmd 是一个对象。这是帮助文件中的一个尝试Application.DoCmd Property

您可以使用 DoCmd 属性访问只读 DoCmd 对象及其相关方法。只读 DoCmd。句法

表达式.DoCmd

表达式 表示应用程序对象的变量。

换句话说,您需要使用acApp.DoCmd而不仅仅是DoCmd. 否则,您的代码无法知道是什么DoCmd意思,因为它不是 Excel 的一部分。

我现在也将插话其他问题。

  1. 我敢肯定,虽然我不知道 Docmd.TransferSpreadSheet 是如何实现的,它可能会在没有用户参与的情况下使用 DAO 或 ADO。

  2. 如果您使用 VBA 实施任何使用不同 Office 应用程序的解决方案,如果您的 Office 版本比您的任何用户都新,则通常需要后期绑定。以我的经验,早期绑定适用于从 2003 年升级到 2010 年,但是一旦你做出了改变,你就不能回去了。对旧版 VBA 的任何更新都会自动更新对当前引用的引用并破坏版本兼容性。因此,如果您在用户之前使用早期绑定和更新,则需要切换到后期绑定或停止支持您的系统。

于 2012-08-28T18:41:15.217 回答
2

如果没有 Access 类型库的引用集,Excel 将不知道 Access 命名常量acImportacSpreadsheetTypeExcel9. 对于 TransferSpreadsheet 方法,使用这些常量的值而不是它们的名称。

如果 OpenInvoices 是文字 Access 表名称,请添加引号。但是,如果 OpenInvoices 是包含 Access 表名称的变量的名称,则不需要引号。

DoCmd.TransferSpreadsheet 0, 8, "OpenInvoices", ssheet, True, ssrange

因此,要回答您问题的三个部分:

  1. 我怀疑它在 OpenInvoices 周围没有引号就崩溃了,因为 Excel 没有找到名为 OpenInvoices 的变量,因此试图不提供TransferSpreadsheet任何表名。
  2. 是的,有点。我认为您的TransferSpreadsheet方法应该适用于这些答案中建议的修订。但是,我也认为TransferSpreadsheet 使用 DAO。
  3. 后期绑定可以防止某些类型的问题。但是您必须使用相应常量的值而不是它们的名称,或者在您的过程中将它们重新定义为常量。后期绑定与 ADO 对我来说是一个令人困惑的问题。这不是非此即彼的事情……当我使用 ADO 时,我几乎总是使用后期绑定来避免由于与特定 ADO 版本的早期绑定而导致的部署问题。
于 2012-08-28T18:19:08.083 回答
0

表名应该是一个字符串。

acSpreadsheetTypeExcel9 = 8
acImport = 0
DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _
    "OpenInvoices", ssheet, True, ssrange
于 2012-08-28T18:18:34.267 回答