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 以特定时间间隔从 .txt 文件中读取?