通过 MS Access vba 将一个文件夹中的 CSV 文件合并为一个文件
Posted
技术标签:
【中文标题】通过 MS Access vba 将一个文件夹中的 CSV 文件合并为一个文件【英文标题】:Combining CSV files from one folder into one file through MS Acces s vba 【发布时间】:2018-07-30 11:41:03 【问题描述】:您好,我完成了计算和导出带有结果的 csv 的程序部分。 (最终大约有 1600 个 csv 文件)每个文件只有 1 列和 20 到 0 行之间。我希望我的 MS Access VBA 程序将它们组合成一个更大的 CSV。所以在新文件的顶部只有一次相同的标题。
到目前为止,我的程序似乎在尝试导入 Reg 的部分失败了。文件编号。
Dim db As DAO.Database
Set db = CurrentDb
MTH = Format(Date, "mmm")
UserInput = InputBox("Enter Country Code")
Dim strSourcePath As String
Dim strDestPath As String
Dim strFile As String
Dim strData As String
Dim x As Variant
Dim Cnt As Long
Dim r As Long
Dim c As Long
Dim wks As Excel.Worksheet
Application.Echo False
'Change the path to the source folder accordingly
strSourcePath = "Q:\CCNMACS\AWD" & CTRY
If Right(strSourcePath, 1) <> "\" Then strSourcePath = strSourcePath & "\"
'Change the path to the destination folder accordingly
strDestPath = "Q:\CCNMACS\AWDFIN"
If Right(strDestPath, 1) <> "\" Then strDestPath = strDestPath & "\"
strFile = Dir(strSourcePath & "*.csv")
Do While Len(strFile) > 0
Cnt = Cnt + 1
If Cnt = 1 Then
r = 1
Else
r = Cells(Rows.Count, "A").End(xlUp).Row + 1
End If
Open strSourcePath & strFile For Input As #1
If Cnt > 1 Then
Line Input #1, strData
End If
Do Until EOF(1)
Line Input #1, strData
x = Split(strData, ",")
For c = 0 To UBound(x)
wks.Cells(r, c + 1).Value = Trim(x(c)) 'Error is here: Run time error '91': Object variable or With Block variable not set
Next c
r = r + 1
Loop
Close #1
Name strSourcePath & strFile As strDestPath & strFile
strFile = Dir
Loop
Application.Echo True
If Cnt = 0 Then _
MsgBox "No CSV files were found...", vbExclamation
【问题讨论】:
您需要分享一个数据示例,以及它是如何组合的。如果我正确理解您需要做什么(即将几个文件附加到一个“长”文件中),那么在没有 VBA 的情况下有几种方法可以做到这一点。 在 excel 和 ms-access 之间,仅今天就被问了 3 次。 所以该文件非常基本,只是在 A 列中的标题为“Reg. Number”,在此之下您将获得 20 到 0 个最多 9 个字符长的数字条目 @Jeeped 我一直在寻找类似我的问题的东西,但我只能在 Dos、python 和 R 中找到人们这样做的例子。 【参考方案1】:您的问题对于您要做什么并不是绝对确定的,但如果我理解正确,您只需将几个文件附加到彼此的末尾,以使 “一个大 CSV” .
如果这是真的,那么有几种方法可以比使用 VBA 简单得多。 .CSV
文件只是纯文本文件,每个字段用逗号分隔,文件扩展名为.CSV
。
就我个人而言,我会使用Notepad++(我认为它可以做到这一点;它可以做其他所有事情),或者更简单,我会使用 Windows 命令提示符。
假设您有一个包含文件的文件夹:
File1.csv
File2.csv
File3.csv
...etc
打开 Windows 命令提示符。 (一种方法是使用 Windows 键 + R,然后键入 cmd
并按 Enter。)
使用cd
将目录更改为文件位置(与ChDir
相同)。
(例如,您可以使用cd c:\users\myFolder
,
然后点击 Enter)
要将文件夹中的所有CSV
合并为一个,您可以使用如下命令:
copy *.csv combinedfile.csv
就是这样!
创建了一个名为combinedfile.csv
的文件。您可以在 Excel 或文本编辑器(如记事本)中打开以仔细检查并在必要时手动调整。
显然,您可以通过多种方式更改命令,例如,如果您只想要以单词 File
开头的文件,您可以使用:
copy file*.csv combinedFile.csv
【讨论】:
是的。 DOS 规则。 试过了,效果很好。唯一的问题是它也将所有标题组合在一起,但看到它们都是相同的,这是一个快速过滤器和固定的。再次感谢 是否可以在 VBA 中将此 DOS 调用为命令?像一个函数。会调用这个程序的人几乎肯定根本不知道如何使用 DOS。【参考方案2】:这应该做你想做的。
Sub Import()
Dim strPathFile As String, strFile As String, strPath As String
Dim strTable As String
Dim blnHasFieldNames As Boolean
' Change this next line to True if the first row in EXCEL worksheet
' has field names
blnHasFieldNames = True
' Replace C:\Documents\ with the real path to the folder that
' contains the EXCEL files
strPath = "C:\your_path_here\"
' Replace tablename with the real name of the table into which
' the data are to be imported
strTable = "Table1"
strFile = Dir(strPath & "*.csv")
Do While Len(strFile) > 0
strPathFile = strPath & strFile
DoCmd.TransferText acImportDelim, "", strTable, strPathFile, blnHasFieldNames
' Uncomment out the next code step if you want to delete the
' EXCEL file after it's been imported
' Kill strPathFile
strFile = Dir()
Loop
End Sub
有关此主题的更多详细信息,请参阅下面的链接。
https://anthonysmoak.com/2018/04/10/how-to-fix-an-import-specification-error-in-microsoft-access/
https://www.oakdome.com/programming/MSAccess_ExportSpecifications_TransferText_To_CSV.php
【讨论】:
以上是关于通过 MS Access vba 将一个文件夹中的 CSV 文件合并为一个文件的主要内容,如果未能解决你的问题,请参考以下文章
带有空格和范围的 MS Access VBA acImport 工作表名称