【问题标题】:Combine multiple csv to single xslx using Access VBA使用 Access VBA 将多个 csv 合并到单个 xslx
【发布时间】:2014-10-21 11:31:12
【问题描述】:

我在尝试将不同的 csv 文件合并为一个 xslx 工作簿文件作为 MS Access 中的单独工作表时遇到问题。我查找的很多东西都是针对 excel 的,但我需要能够在 Access 中使用它。我为我尝试在表单中使用的 excel vba 找到的代码通常会给我错误,大部分时间是“对象的方法'_Global'失败”,即使我引用了 excel 库以及添加 Excel。所有必要对象的前缀,例如工作簿和工作表。

编辑:

这是我尝试使用的示例代码,用于从 csv 到 xslx 的转换

 Dim CSVfolder As String
 Dim XlsFolder As String
 Dim fname As String
 Dim wBook As Excel.Workbook

 CSVfolder = "C:\test\"
 XlsFolder = "C:\test\"

 fname = Dir(CSVfolder & "*.csv")

 Do While fname <> ""
 Set wBook = Excel.Workbooks.Open(CSVfolder & fname, Format:=6, Delimiter:=",")
 wBook.SaveAs XlsFolder & Replace(fname, ".csv", ""), FileFormatNum = 51
 wBook.Close False
 fname = Dir
 Loop

具体来说,错误在 SaveAs 行被捕获,这一次是说 Method 'SaveAs' of object '_Workbook' failed。

【问题讨论】:

  • 您能解释一下您要在这里做什么吗?替换(fname,“.csv”,“”)。在我看来,您正在删除文件扩展名,然后尝试保存,这不起作用
  • 您到底想达到什么目的? 10 个不同的 .csv 合并为一个 .xlsx?还是将 10 个不同的 .csv 文件放入 Access 表中?
  • 第一种,多合一excel书

标签: excel vba ms-access csv xlsx


【解决方案1】:

我猜您想使用 Access vba 将多个 csv 文件合并到一个主 Excel 文件中? 如果是这样,请先在脑海中制定一个计划如何实现这一目标。

伪将是:

  1. 在文件夹中搜索 csv 文件
  2. 打开 csv 文件并将工作表/内容复制到主文件
  3. 保存主文件
  4. 执行上述步骤,直到没有更多文件要做为止

在代码中是:

Private Sub Merge()
    'Create Excel application instance
    Dim xlApp As Object
    Set xlApp = CreateObject("Excel.Application")

    'Setup workbooks
    Dim wB As Excel.Workbook
    Dim wBM As Excel.Workbook

    'Csv files folder
    Dim CSVfolder As String
    CSVfolder = "C:\CsvFolder"

    'Master Excel file path
    Dim mF As String
    mF = Application.CurrentProject.path & "\Master.xlsx" 'Where your master file is

    'open the master file
    Set wBM = xlApp.Workbooks.Open(mF)

    'search and open the client files
    Dim fname As String
    fname = Dir(CSVfolder & "\*.csv")
    Do While fname <> ""
       'open the client file
       Set wB = xlApp.Workbooks.Open(CSVfolder & "\" & fname)
       'copy the first sheet from client file to master file
       wB.Sheets(1).Copy After:=wBM.Sheets(wBM.Sheets.count)
       'save master file
       wBM.Save
       'close client file
       wB.Close False
       'move to next client file
       fname = Dir()
    Loop

    xlApp.visible = True
    Set xlApp = Nothing
End Sub

请考虑在您的最终代码中捕获错误。 希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果您想在 Access 中使用它,这很容易。 Access 有所谓的链接表。这些是不在 Access 中的表,但无论它们已经存在于何处/任何地方,它们都保持不变。 Access 有一个指向它的链接,您会看到它的外观和行为类似于 Access 表。
    执行此操作的命令是:

    DoCmd.TransferText acLinkDelim, , "tblTemp", "MyFile.csv", True
    

    您还需要创建一个如下所示的查询(我们称之为 qryMaster)

    INSERT INTO tblMaster SELECT * FROM tblTemp
    

    这是代码

    Sub ImportCSV()
        Dim fname As String
        Dim CSVfolder As String
        CSVfolder = "C:\test\"
        fname = Dir(CSVfolder & "*.csv")
    
        Do While fname <> ""
            DoCmd.TransferText acLinkDelim, , "temp", fname, True
            CurrentDb.Execute ("qryMaster")
        Loop
        DoCmd.DeleteObject acTable, "tblTemp"
    End Sub
    

    在运行之前,您必须创建 tblmaster。最简单的方法是手动导入 1 个文件。

    【讨论】:

    • 感谢编辑。我很着急,甚至没有注意到。
    【解决方案3】:

    当您应该将文件扩展名替换为正确的文件扩展名时,您却将其替换为任何内容。我没有查,但我假设 51 是一个 *.xlsx 文件。

     wBook.SaveAs XlsFolder & Replace(fname, ".csv", ".xlsx"), FileFormatNum = 51
    

    顺便说一句,你真的应该使用命名常量而不是幻数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-12
      • 1970-01-01
      • 2021-07-07
      • 2019-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多