Excel 访问VBA-导入问题

Excel 访问VBA-导入问题,excel,ms-access,vba,Excel,Ms Access,Vba,我正在将一些数据表单Excel导入Access,我遇到了一些奇怪的问题 问题: 我正在使用DoCmd.TransferSpreadsheet方法将Excel数据导入Access,如下所示: DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Excel_Data", "Filename", True 此“Excel_数据”表不是预先创建的,因此Access会自行创建它。为什么?若我预先创建它,那个么用户必须以完全相

我正在将一些数据表单Excel导入Access,我遇到了一些奇怪的问题

问题:

我正在使用DoCmd.TransferSpreadsheet方法将Excel数据导入Access,如下所示:

DoCmd.TransferSpreadsheet acImport, acSpreadsheetTypeExcel12Xml, "Excel_Data", "Filename", True
此“Excel_数据”表不是预先创建的,因此Access会自行创建它。为什么?若我预先创建它,那个么用户必须以完全相同的顺序将数据从Excel导入目标表(Excel中的A列是Access中的第1行等)

但如果您不预先创建它,Access就会创建Excel中的任何表,并且您只能根据列名导入所需的数据。这就是它被卡住的地方

我不知道为什么,但在我这样做的每一次导入中,Access都只创建文本字段,然后导入到目标表

但在其中一个导入中,Access创建了一个数字字段,然后导入到目标表中不再工作。所有Excel数据的格式均为“常规”

有人知道如何避免这种情况吗

基本上,我只想根据列名称,以excel中的任何列顺序,将excel数据导入Access


谢谢你的帮助

我建议这样使用查询,而不是
TransferSpreadsheet

SELECT * INTO Table1 
  FROM [Sheet1$D3:E24] 
    IN "C:\Temp\Test.xls" [Excel 12.0;HDR=YES;IMEX=1];
注意,IMEX=1允许您抑制数据类型猜测,并且Access将始终创建文本字段


此外,这将允许您从指定的电子表格范围导入数据,并使用WHERE子句过滤不必要的数据

谢谢您的所有回答,但我已经自己解决了这个问题。在执行导入时避免任何问题的最好方法是在DoCmd.TransferSpreadsheet方法完成后简单地使用ALTERTABLE命令。我只是将所有列更改为文本格式,将所有其他表更改为文本字段,现在对数据的每一次操作都很正常。

可能重复“否”,这不是我的线程。但同样的问题,是的。我已经弄明白了,如果您手动将所有excel数字数据格式化为文本,它就会工作。但我想要某种自动化的解决方案。可以这样做吗?链接问题的答案包含多个建议的问题解决方案。Access'
DoCmd.TransferSpreadsheet导入
方法必须对其导入的列的数据类型进行假设。。。我认为它是通过查看电子表格中列的前10行左右来实现的,并以此为基础。如果你想要文本时它假设为数字,也许可以对有问题的列中的电子表格进行排序,使看起来像文本而不是数字的数据位于顶部,看看这是否有帮助。这是一种可怕的行为。问题只是数字数据。但我不明白为什么在某些情况下Access会创建一个文本字段而不是数字。我有两个不同的电子表格:在这两个表格的第1列中都有数值,并且两列的格式都是General。唯一的区别是两位数字的长度,但Access为一个电子表格创建了一个文本字段,为另一个电子表格创建了一个数字字段。我试图使您的代码工作,但它不工作。我需要放置变量“Filename”,而不是像“C:\Temp\Test.xls”这样的确切文件位置。尽管如此,您的解决方案对我仍然不起作用,我需要在VBA中按正确的顺序放置撇号,但不知道如何操作。创建SQL文本作为字符串,并使用您的变量:
strSQL=“INSERT…in”“&Filename&”“[…”
然后运行它:
CurrentDB.Execute strSQL,dbFailOnError
。没有注意到撇号。如果您谈论文件名周围的引号,只需使用单引号,正如我在这篇评论中建议的那样,有两个引号-单引号和双引号-我尝试过了,但它对我不起作用,我的导入代码很长,可能出了问题这里。我想当Access自己创建数据类型时,我必须小心。我已经准备好将所有表设置为所需的数字字段,现在它可以工作了。现在我只是在等待可能出现的问题,到目前为止还没有出现任何问题。你是什么意思“不起作用?错误是什么?请先尝试测试数据,只有几行。此方法在我的许多应用程序中运行良好,我根本不使用TransferSpreadsheet。抱歉,手动键入,在SQL的第一行中出错。请重试。我已将注释更改为回答。”。