我很幸运地使用了带有这些参数的命令:
DoCmd.TransferSpreadsheet 0, 10, tableName, wbPath, True, "MySheet!A1:C100"
该行是从工作应用程序中复制粘贴的,其中 Excel 文件中的数据被导入到现有的 Access 表中,而不会覆盖或更改表中的现有数据。
参数列表说明:
- 0:应该和acImport枚举一样
- 10:与 acSpreadsheetTypeExcel12Xml 枚举相同(我想我使用整数 10 是因为某些兼容性,其中枚举具有不同的值或在某些版本的 Access 中未定义)
- tableName:是 Access 数据库中现有表的名称
- wbPath:是以 xlsx 格式保存的工作簿的绝对文件路径
- True:表示工作表有标题
- “MySheet!A1:C100”表示应导入的工作表名称和单元格范围。
我不记得 Excel 工作表中的列标题和/或列顺序是否必须与 Access 表列匹配。但它们应该匹配肯定是有道理的。你检查过吗?
我记得如果 Excel 工作表中单元格中的某些数据类型与 Access 表中相应列的数据类型不匹配/不匹配,Access 会创建一些临时“报告表”,这表明出现错误在导入过程中发生。也许这就是你正在经历的?
这里是文件类型枚举(第二个函数参数)及其对应文件类型的列表。您是否使用了正确的枚举值?我看到您提供的值为 acSpreadsheetTypeExcel9,您是从 Excel 2000 文件导入的吗?
Excel 3 acSpreadsheetTypeExcel3
Excel 95 acSpreadsheetTypeExcel7
Excel 97 acSpreadsheetTypeExcel8
Excel 2000 acSpreadsheetTypeExcel9 (default)
Excel 2002 acSpreadsheetTypeExcel10
Excel 2003 acSpreadsheetTypeExcel11
Excel 2007 Binary Format (.xslb) acSpreadsheetTypeExcel12
Excel 2007 (xlsx) acSpreadsheetTypeExcel12Xml
更新:
Access 将使用您从中运行宏的当前数据库中的表(假设您从 Access 中运行它)。如果你想导入到另一个数据库,你可以这样做:
Dim accessApplication As Variant
Set accessApplication = CreateObject("Access.Application")
accessApplication.OpenCurrentDatabase databasePath, False
accessApplication.DoCmd.TransferSpreadsheet 0, 10, tableName, wbPath, True, "MySheet!A1:C100"
其中 databasePath 是现有数据库的绝对文件路径。最后一个参数指定是否要以独占模式打开数据库。默认值为 False,表示应以共享模式打开数据库。
以上代码将确保将数据导入到特定Access数据库文件中的指定表中。
如果您希望导入的所有数据都存储在一个 Excel 文件中,我建议您将导入宏放在 Excel 文件中,而不是将其放在多个 Access 文件中。这使得维护宏变得更容易。请记住在 VBA 编辑器的工具 -> 引用中添加对 Microsoft Access 对象库的引用。如果你有多个 Excel 文件和多个 Access 文件,你可以考虑拥有一些主 Excel 工作簿,它只保存宏,然后打开其他 Excel 文件和 Access 数据库。