如何将Excel数据移动到Access使用VBA和后期绑定(没有ADO,没有DAO) – DoCmd.TransferSpreadsheet运行时错误424?

我正在尝试创build一个macros,它将定期将Excel中的25,000到35,000行移动到Access数据库。 据我所知,如果我在一个使用macros的人使用不同版本的Excel和Access的环境中工作(我碰巧使用的是2007),我最好使用后期绑定,因为它避免了不同引用的问题和版本等。 – 一旦工作,它就可以工作(尽pipe速度较慢)。

我试图让下面的代码在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 

当macros到达DoCmd.TransferSpreadsheet行时,它会停止并显示一个错误消息:

运行时错误424:

所需对象

Excel中的这个例程从另一个例程中调用,该例程从大型工作簿中的许多工作表中收集信息,并将其全部转储到该工作簿中名为“AllData”的工作表中。 我不断看到这个DoCmd.TransferSpreadsheet方法的在线参考,但我似乎无法find任何剪切和粘贴代码工作…

  1. 为什么这个例程在这一点上不断崩溃?
  2. 如果不使用ADO或DAO,甚至可以将date从Excel传输到Access?
  3. 后期绑定是否可以防止出现问题,还是使用ADO更好?

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

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

DoCmd是一个对象。 这里是从帮助文件Application.DoCmd Property的一个exert

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

expression.DoCmd

expression式表示应用程序对象的variables。

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

现在我也会谈谈其他问题。

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

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

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

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

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

所以要回答你的问题的三个部分:

  1. 我怀疑它在OpenInvoices周围没有引号而崩溃,因为Excel没有find名为OpenInvoices的variables,所以试图给TransferSpreadsheet作为表名。
  2. 是的,有点。 我认为您的TransferSpreadsheet方法应该与这些答案中提出的修订一起工作。 不过,我也认为TransferSpreadsheet使用DAO。
  3. 后期绑定可以防止某些types的问题。 但是,您必须使用各自常量的值而不是名称,或者将其重新定义为常量。 迟绑定与ADO是一个令人困惑的问题给我。 这不是一个/或什么东西…当我使用ADO时,我几乎总是使用后期绑定,以避免由于早期绑定到特定的ADO版本而导致的部署问题。

表名应该是一个string。

 acSpreadsheetTypeExcel9 = 8 acImport = 0 DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel9, _ "OpenInvoices", ssheet, True, ssrange