本质上有两种方法可以预先设置文本文件(.txt、.csv、.tab)导入 Access 数据库的数据列,这两种方法都使用不同的 VBA 方法。
1. 规格对象(保存在数据库中)
在这里,你使用DoCmd.TransferText https://msdn.microsoft.com/en-us/library/office/ff835958.aspx其中参数之一是可选的规范名称(无扩展名或路径)。
DoCmd.TransferText(TransferType, SpecificationName, TableName, FileName,
HasFieldNames, HTMLTableName, CodePage)
要创建此规范对象,您只需手动导入示例文本文件一次,完成向导,然后在最后一部分完成之前,单击“高级”按钮,该按钮总结了您刚刚指定的所有项目——字段名称、长度、数据类型等等。继续通过单击对话框窗口上的“另存为”来保存整个摘要文件,并记住您为其指定的名称,即上面的规范参数。
事实上,一旦保存规格,您就可以完全取消向导。导入/导出规范存储在可查询的 Access 系统表 MSysIMEXSpecs 中,并且可以在 .accdb 文件的生命周期内使用和重复使用甚至覆盖(再次通过向导)。事实上,您甚至可以导入到其他数据库(单击“外部数据”向导中的“高级”)。
2.Schema.ini文件(保存在数据库之外)
此处,文本文件表现为外部表,因为它包含可以链接到 Access 或通过记录集打开的架构,如上所述微软网站 https://support.microsoft.com/en-us/kb/149090。现在需要一种解决方法,因为此外部文件不会使用导入方法实现自动化。下面是链接表选项的修改,其中通过 Make-Table 查询创建本地表(包含所有架构、结构和数据)。之后,链接表被销毁(不是表本身,只是链接)。将此调整到您的应用程序中,可能在按钮 OnClick 或表单 OnOpen 事件中或通过 AutoExec 宏从 VBA 模块调用(当数据库首次打开时)。
Function LinkSchema()
Dim db As DATABASE, tbl As TableDef
Set db = CurrentDb()
Set tbl = db.CreateTableDef("Linked Text")
tbl.Connect = "Text;DATABASE=c:\my documents;TABLE=csvFile_linked"
tbl.SourceTableName = "csvFile.csv"
db.TableDefs.Append tbl
db.TableDefs.Refresh
db.Execute "SELECT * INTO csvFile_local FROM csvFile_linked", dbFailOnError
db.TableDefs.Delete("csvFile_linked")
Set tbl = Nothing
Set db = Nothing
End Function
如上所述,我个人从不使用 schema.ini 文件,这甚至可能是一种过时的传统方法,因为 Microsoft 支持不是最新的。规格提供了流动的灵活性,因为它们与导入/导出程序集成在一起。另外,它们直接保存在数据库中,无需外部管理。