MS Access 中文件的导入循环:如何在每个文件上运行宏并替换临时表的内容

Posted

技术标签:

【中文标题】MS Access 中文件的导入循环:如何在每个文件上运行宏并替换临时表的内容【英文标题】:Import Loop for files in MS Access: How to run macros on each file and replace the contents of a staging table 【发布时间】:2022-01-24 03:12:20 【问题描述】:

我正在使用 MS Access 从文件夹中导入大量文本文件。每个文本文件都具有相同的结构和一个包含有用数据的大标题。我将每个文本文件作为空格分隔文件导入到临时表中,并使用一系列查询来收集相关信息并将所有内容附加到主表中。我正在尝试自动化此过程,并创建了一个宏来运行所有查询。我正在使用以下 VBA 尝试遍历文件夹中的每个文件,但遇到了几个问题。我似乎无法获得下一个文件导入来替换每次迭代的临时表的内容。我是 VBA 新手,所以任何提示或提示将不胜感激!

Public Sub LoopThroughFiles()
Dim strFileName As String
Dim intNumberOfFiles As Integer

intNumberOfFiles = 0

strFileName = Dir("My_File_Path\*", vbNormal)

Do Until strFileName = ""
    intNumberOfFiles = intNumberOfFiles + 1
    strFileName = Dir()
      DoCmd.TransferText acImportDelim, My_Import_Spec, "My_Staging_Table", Dir(), False
  DoCmd.RunMacro ("RunMacros")
  
    
Loop


End Sub

编辑 1: 你好,感谢迄今为止的精彩回答!我已经实现了以下代码,但我在 DoCmd.TransferText 行上不断收到相同的错误: "运行时错误 3027

无法更新。数据库或对象是只读的。”

根据您的建议,这是我正在使用的代码:

Private Sub Loopthroughfiles()


    Const SRC_PATH As String = "FilePath" 'for example
    
    Dim strFileName As String
    Dim NumberOfFiles As Long 'prefer Long to Integer
    
 
    
    strFileName = Dir(SRC_PATH & "*.txt", vbNormal)
       NumberOfFiles = 0
    
   
    
    Do Until strFileName = "FilePath\LastFileName.txt"
        NumberOfFiles = NumberOfFiles + 1
        
        DoCmd.TransferText acImportDelim, MyImportSpec, "MyStagingTable", _
                           SRC_PATH & strFileName, False
        
        DoCmd.RunMacro "RunMacros"
      
        strFileName = Dir() 'next file
    
       CurrentDb.Execute "DELETE * FROM [MyStagingTable]", dbFailOnError
    Loop

    MsgBox NumberOfFiles & " files imported"
    
End Sub

【问题讨论】:

【参考方案1】:

这是你想要的吗?

Private Sub Command0_Click()

        Dim strPathFile As String, strFile As String, strPath As String
        Dim strTable As String
        Dim blnHasFieldNames As Boolean

        blnHasFieldNames = True

        strPath = "C:\Users\ryans\OneDrive\Desktop\test\"

        strTable = "Table1"

        strFile = Dir(strPath & "*.txt")
        Do While Len(strFile) > 0
              strPathFile = strPath & strFile
              DoCmd.TransferText acImportDelim, _
                TableName:="Test1", _
                FileName:=strPath & strFile, _
                HasFieldNames:=True
              strFile = Dir()
        Loop


End Sub

如果没有,请回复详细信息。

【讨论】:

【参考方案2】:

我认为也许这样的事情应该可行:

    Const SRC_PATH As String = "C:\Testing\" 'for example
    
    Dim strFileName As String
    Dim NumberOfFiles As Long 'prefer Long to Integer
    
    NumberOfFiles = 0
    
    strFileName = Dir(SRC_PATH & "*.txt", vbNormal)
    
    Do Until strFileName = ""
        NumberOfFiles = NumberOfFiles + 1
        
        DoCmd.TransferText acImportDelim, My_Import_Spec, "My_Staging_Table", _
                           SRC_PATH & strFileName, False
        
        DoCmd.RunMacro "RunMacros"
      
        strFileName = Dir() 'next file
    Loop

    MsgBox NumberOfFiles & " files imported"


【讨论】:

嗨蒂姆,感谢您的详细回答!我仍然遇到一个问题,因为当我在最后尝试此代码时,暂存表没有被清除并替换为每次迭代的下一个文件的导入内容,有什么建议吗? @Sam Nowak,将CurrentDb.Execute "DELETE * FROM [My_Staging_Table]", dbFailOnError 放在Loop 语句之前。请注意,如果这是本地存储的数据库,您需要偶尔运行压缩和修复数据库过程以避免数据库膨胀。 抱歉 - 我可以帮助处理 Dir() 循环,但我对 Access 一无所知...

以上是关于MS Access 中文件的导入循环:如何在每个文件上运行宏并替换临时表的内容的主要内容,如果未能解决你的问题,请参考以下文章

暂时禁用 MS Access 数据宏

如何让 MS Access 以特定时间间隔从 .txt 文件中读取?

自动将不同的 Excel 文件导入 MS Access 2010 表

MS Access使用DLookup的结果循环

将 MS Access 表定义导出和导入为文本文件

从关闭的 CSV 更新 MS Access 数据表而不导入