通过 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

在 VBA 中为 MS Access 中的用户携带一个变量

MS Access中的VBA中不接受变量名称

带有空格和范围的 MS Access VBA acImport 工作表名称

使用 VBA 激活打开的 MS Access 文件以发送密钥

使用 VBA 将 MS Access 报告打印到 .xps 文件