导入数据从Excel中访问使用ms excel vba

我遇到了一个随机发生的问题(在我的机器上运行 – 大概有90%的时间,客户端机器上的几次尝试都没有100%的时间)下面是代码:

sub importdata() Dim dbpath As String Dim acc As New Access.Application 'bunch of stuff acc.OpenCurrentDatabase dbpath & "\Database.accdb" acc.DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\Dashboard 2015.04.17.xlsm", True, "DataForImport!" acc.CloseCurrentDatabase acc.Quit 'bunch of more stuff end sub 

DataForImport是数据所在的工作表。 它在一张桌子里; 但是,访问未能将表名称“Sales”识别为要导入的范围,因此我导入了整个表单。

在客户端的机器上的代码给传输spreadsheet表行上的错误(试图打开与仪表板文件的Excel的另一个实例,并说文件已经打开,错误三千东西); 然而,在我的机器上它运行得很好。

有没有人遇到类似的问题? 有没有更好的方法来推动数据从Excel中访问?如果不是,传输spreadsheets喜欢封闭的文件,所以我需要closures文件我从(仪表板)导入数据之前,运行这段代码,并重新打开后?

谢谢!

回答:

保存一个临时文件,并从中推送效果很好

 Workbooks.Add.SaveAs dbpath & "\tempwb.xlsx" Set tempwb = Application.Workbooks("tempwb.xlsx") Application.Workbooks(dashboard).Activate acc.OpenCurrentDatabase dbpath & "\Database.accdb" Application.Workbooks(dashboard).Sheets("DataForImport").Copy Before:=tempwb.Sheets(1) tempwb.Save tempwb.Close acc.DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\tempwb.xlsx", True, "DataForImport!" Kill dbpath & "\tempwb.xlsx" acc.CloseCurrentDatabase acc.Quit Set acc = Nothing 

理论上,你的代码应该没问题。

在现实中,因为Office产品通常不喜欢你想要做的事情,所以我强烈build议你在Access中进行所有的导入

那么你只需要你一行vba:

 DoCmd.TransferSpreadsheet acImport, 10, "tbl_SalesData", dbpath & "\Dashboard 2015.04.17.xlsm", True, "DataForImport!" 

…或一个可以逐步构build的等效非VBAmacros。

Access.application – >你正在使用早期绑定。 你的客户有不同版本的Office吗? 你可能需要使用后期绑定重新编写它(比如dim acc作为Object,然后设置Acc = CreateObject(“Access.application”)),那么你可能会在客户机上看到和你一样的成功率。

对于传输电子表格,你需要一个封闭的文件,为了解决这个问题,我使用了一个简单的方法,

 xls.save 'save your current file filecopy currentpath, dir(currentPath) & "\zzztmp.xls" 'make a copy in the same folder named zzztmp docmd.transfer here with the TEMP file path kill dir(currentPath) & "\zzztmp.xls" 'this will delete the temp file and our data is in Access and the user is happy 

这样,用户不知道你已经保存了一个副本并将其导入到访问中,但这意味着你不必closures该文件并将用户的excel文件消失并重新导入到访问中。