Vba 导入带有分隔符的文本

Vba 导入带有分隔符的文本,vba,ms-access,Vba,Ms Access,我正在尝试自动添加新的文本文件,这些文件都具有相同(已知)的布局 使用选项卡(选项卡按钮)分隔列。我的问题是,是否可以在VBA中执行此操作?例如,在用于导入文本文件的access向导中 我正在使用VBA中的DoCmd.TransferText方法您需要执行一次向导才能生成规范文件。要执行此操作,请像导入普通文本文件一样导入文本文件,但在深入向导之前,请单击左下角的“高级…”按钮。这是制作等级库文件的地方 使所有这些列与您的输入文件、数据类型和所有内容匹配。确保选择{tab}字段分隔符和适当的文

我正在尝试自动添加新的文本文件,这些文件都具有相同(已知)的布局

使用选项卡(选项卡按钮)分隔列。我的问题是,是否可以在VBA中执行此操作?例如,在用于导入文本文件的access向导中


我正在使用VBA中的
DoCmd.TransferText
方法

您需要执行一次向导才能生成规范文件。要执行此操作,请像导入普通文本文件一样导入文本文件,但在深入向导之前,请单击左下角的“高级…”按钮。这是制作等级库文件的地方

使所有这些列与您的输入文件、数据类型和所有内容匹配。确保选择
{tab}
字段分隔符和适当的文本限定符(如果正在使用)

保存您的规格(稍后可以通过返回同一屏幕并单击
Specs…
然后保存旧规格来编辑)

现在您可以像这样在VBA中使用

DoCmd.TransferText acImportDelim, "your spec name", "destination table name", sourceFilePath

有一个参数
HasFieldNames
,您必须根据您的文件来决定它是
true
还是
false

使用导入向导的缺点是,即使文件格式有一点点变化,您也必须再次单击所有这些步骤才能使导入工作

查看@Remou在中的答案,以了解用直接SQL实现这一点的方法。实际上,我在我的一个项目中使用了相同的方法。我使用类似的方法(有关详细信息,请参见我的链接):

只有一个警告。如果将此SQL语法放入普通Access查询对象中,Access很有可能会将其破坏到甚至无法打开查询对象的程度。因此,当您在Access中尝试查询时,编写查询并将其保存在文本文件中。测试查询并运行后,将其保存在VBA子例程中,以便Access能够按原样运行查询,如下所示:

sub MyTableImport()
  sqlStr = "         insert into MyTable (column-list) " ' leave a space at the
  sqlStr = sqlStr & "select (column-list...) " ' end of each line of the string
  sqlStr = sqlStr & "from [data-source-specifications].[file-name] "
  sqlStr = sqlStr & "any-other-clauses... ;"

  DoCmd.RunSQL sqlStr
end sub

从这类过程开始,最简单的方法是在excel/access或其他任何程序中记录您手动执行的宏,然后获取生成的VBA并将其概括为输入参数等@JonEgerton我认为您不能在access中记录宏。不,但您应该能够在excel中记录宏,然后在代码中重新使用生成的VB-对象模型将可用(只要您输入正确的引用)。@JonEgerton除非您通过Excel VBA打开一个访问表,否则您将无法访问表。还有,既然可以在Access中以本机方式完成,为什么还要在Excel中编写并在Access中使用Excel引用呢?我理解试图通过录制宏来简化,但在这种情况下可能会进一步混淆问题。从技术上讲,您也可以使用较新的导入/导出配置文件API从XML组装自己的I/O规范。这很棘手,但也有可能——我以前也做过。瞧,@JoshuaHonig自己做有什么好处?映射是否比此方法“更好”?这是一个非常快速的过程,不是吗?您可以在运行时动态创建规范。有时这是必要的,尤其是当一个应用程序被分发给其他人时。我用以下代码尝试了这一点:
DoCmd.TransferText acImportDelim,“Tags\u AI\u DB\u importspecifie”,“Tags\u AI\u DB”,“C:\Data\PLC\u MOBZ\Test\Scada\u DBs\Tags\u AI\u DB.txt”,True
(True)用于将第一行用作字段名,但由于某些原因,这使得access只需删除第一行,而调用列“row1、row2、row3、row4等”
sub MyTableImport()
  sqlStr = "         insert into MyTable (column-list) " ' leave a space at the
  sqlStr = sqlStr & "select (column-list...) " ' end of each line of the string
  sqlStr = sqlStr & "from [data-source-specifications].[file-name] "
  sqlStr = sqlStr & "any-other-clauses... ;"

  DoCmd.RunSQL sqlStr
end sub