【问题标题】:Is it possible to batch convert csv to xls using a macro?是否可以使用宏将 csv 批量转换为 xls?
【发布时间】:2012-06-03 22:15:22
【问题描述】:

我有大量csv 文件需要.xls 格式。是否可以使用宏运行批量转换或最好使用另一种语言?

我已使用此代码http://www.ozgrid.com/forum/showthread.php?t=71409&p=369573#post369573 来引用我的目录,但我不确定打开每个文件并保存它们的命令。这是我所拥有的:

Sub batchconvertcsvxls()
    Dim wb As Workbook
    Dim CSVCount As Integer
    Dim myVar As String

    myVar = FileList("C:\Documents and Settings\alistairw\My Documents\csvxlstest")
    For i = LBound(myVar) To UBound(myVar)

        With wb

            Application.Workbooks.OpenText 'How do I reference the myvar string ?
            wb.SaveAs '....

        End With

    Next
End Sub

Function FileList(fldr As String, Optional fltr As String = "*.*") As Variant
    Dim sTemp As String, sHldr As String
    If Right$(fldr, 1) <> "\" Then fldr = fldr & "\"
    sTemp = Dir(fldr & fltr)
    If sTemp = "" Then
        FileList = Split("No files found", "|") 'ensures an array is returned
        Exit Function
    End If
    Do
        sHldr = Dir
        If sHldr = "" Then Exit Do
        sTemp = sTemp & "|" & sHldr
    Loop
    FileList = Split(sTemp, "|")
End Function

编辑:文件是格式为 csv 的 .txt 文件

【问题讨论】:

  • 一个有趣的链接:softinterface.com/… 如果你搜索谷歌,有其他软件已经这样做了。但是,如果您将此作为练习,请忽略该链接:)

标签: csv excel batch-processing file-conversion vba


【解决方案1】:

通过结合 Scott Holtzman 和“ExcelFreak”给出的代码,转换效果很好。最终代码如下所示:

Sub CSV_to_XLS()

Dim wb As Workbook
Dim strFile As String, strDir As String

strDir = "U:\path\"
strFile = Dir(strDir & "*.csv")

Do While strFile <> ""

    Set wb = Workbooks.Open(Filename:=strDir & strFile, Local:=True)
    wb.SaveAs Replace(wb.FullName, ".csv", ".xls"), 50 'UPDATE:
    wb.Close True

    Set wb = Nothing
    strFile = Dir
Loop

End Sub

每次打开转换后的 .xls 文件都会抛出警告:

“您尝试打开的文件 'filename' 的格式与文件扩展名指定的格式不同。在打开文件之前,请确认文件没有损坏并且来自受信任的来源。您要现在打开文件吗?”

单击“是”然后打开 .xls 文件。

有没有办法摆脱这个警告信息?每次打开 .xls 文件时,Excel 都会引发警告。

【讨论】:

  • wb.SaveAs Replace(wb.FullName, ".csv", ".xls"), 56 '更新:将其保存为 97-2003 excel 格式并消除警告
  • 您也可以使用wb.SaveAs Replace(wb.FullName, ".csv", ".xlsx"), 51 'UPDATE:,它将保存为Excel 2007格式,并在您打开文件时消除警告。
【解决方案2】:

在少得多的代码行中,这应该可以满足您的需求。但是,我会说这可能不是完成它的最快方法,因为您每次都在打开、保存和关闭工作簿。我会寻找更快的方法,但我忘记了方法。

Sub batchconvertcsvxls()

Dim wb As Workbook
Dim strFile As String, strDir As String

strDir = "C:\"
strFile = Dir(strDir & "*.csv")

Do While strFile <> ""

    Set wb = Workbooks.Open(strDir & strFile)
    With wb
        .SaveAs Replace(wb.FullName, ".csv", ".xls"), 50 'UPDATE:
        .Close True
    End With
    Set wb = Nothing
Loop

End Sub

** 更新 ** 您需要 .xls 文件的正确文件格式枚举。我认为它是 50,但如果不是,你可以在这里查看 Excel File Type Enumeration

【讨论】:

  • 对不起,我应该说它们是格式为 csv 的 .txt 文件。修改了我原来的问题。
  • 这一切都很好。只需将上面对 .csv 的任何引用更改为 .txt。
  • @AlistairWeir -> 在 "Loop" strFile = Dir 之前添加这一行
【解决方案3】:

Scott Holtzman 的代码几乎为我做到了。我必须进行两项更改才能使其正常工作:

  1. 他忘记添加使我们的循环继续下一个文件的行。循环前的最后一行应该是

    strFile = Dir

  2. Workbooks.Open 方法未按预期读取我的 CSV 文件(整行最终成为第一个单元格中的文本)。当我添加参数Local:=True 时,它起作用了:

    Set wb = Workbooks.Open(Filename:=strDir &amp; strFile, Local:=True)

【讨论】:

    【解决方案4】:

    这至少在 Excel 2013 上可以正常工作。使用 FileFormat:=xlExcel8 参数而不是文件类型标记 50 创建的文件可以在没有安全问题的情况下打开。

    Sub CSV_to_XLS()

    将 wb 调暗为工作簿 暗淡 strFile 作为字符串,strDir 作为字符串

    strDir = "C:\temp\" strFile = Dir(strDir & "*.csv")

    Do While strFile ""

    Set wb = Workbooks.Open(Filename:=strDir & strFile, Local:=True)
    wb.SaveAs Replace(wb.FullName, ".csv", ".xls"), FileFormat:=xlExcel8
    wb.Close True
    
    Set wb = Nothing
    strFile = Dir
    

    循环

    结束子

    【讨论】:

      【解决方案5】:

      这是一个很好的问题,我在互联网上找到了几个答案。只需进行非常小的更改(我无法编辑任何已发布的代码),我就可以让事情变得更好:

      Sub CSV_to_XLSX()
      
      Dim wb As Workbook
      Dim strFile As String, strDir As String
      
      strDir = "C:\Users\acer\OneDrive\Doctorado\Study 1\data\Retest Bkp\Day 1\Sart\"
      strFile = Dir(strDir & "*.csv")
      
      Do While strFile <> ""
      
          Set wb = Workbooks.Open(Filename:=strDir & strFile, Local:=True)
          With wb
              .SaveAs Replace(wb.FullName, ".csv", ".xlsx"), 51
              .Close True
          End With
          Set wb = Nothing
          strFile = Dir
      Loop
      
      End Sub
      

      【讨论】:

        猜你喜欢
        • 2011-10-05
        • 2013-02-17
        • 1970-01-01
        • 2011-09-14
        • 1970-01-01
        • 1970-01-01
        • 2011-06-14
        • 1970-01-01
        • 2013-01-25
        相关资源
        最近更新 更多