【问题标题】:Convert multiple Excel sheets to CSV将多个 Excel 工作表转换为 CSV
【发布时间】:2020-08-30 06:35:56
【问题描述】:

我的目标是从输入文件夹中打开多个 excel 文件并将它们转换为输出文件夹中的 .csv。我遇到了一些小问题

  • 代码将 .xlsx 转换为 .csv ,将 .xls 转换为 .csv 但在输出中 文件夹,它存储 .csv 和 .xls 文件。我不知道为什么.xls 文件也被存储。我只希望存储 .csv 文件
  • 我只想从 excel 'Sheet1' 转换数据,但代码是 从活动工作表转换数据。如何指定转换 仅来自“Sheet1”的数据?
Option Explicit

Sub ImportMultipleCsvFile()

    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.DisplayAlerts = False

    Dim InputCsvFile As Variant
    Dim InputFolder As String, OutputFolder As String

    InputFolder = "C:\Users\excel_format"
    OutputFolder = "C:\Users\csv_format"

    InputCsvFile = Dir(InputFolder & "\*.xl??")

    While InputCsvFile <> ""
        Workbooks.OpenText Filename:=InputFolder & "\" & InputCsvFile, DataType:=xlDelimited, Comma:=True

        ActiveWorkbook.SaveAs Filename:=OutputFolder & "\" & Replace(ActiveWorkbook.Name, ".xlsx", ".csv"), FileFormat:=xlCSV, CreateBackup:=False
        ActiveWorkbook.SaveAs Filename:=OutputFolder & "\" & Replace(ActiveWorkbook.Name, ".xls", ".csv"), FileFormat:=xlCSV, CreateBackup:=False

        ActiveWorkbook.Close
        InputCsvFile = Dir
    Wend
    Application.Calculation = xlCalculationAutomatic

End Sub

【问题讨论】:

  • 您有两行 .SaveAs 行 - 一行保存为 xlsx,另一行保存为 xls,这就是创建额外 xls 文件的原因。
  • @Applecore 如果我删除了第二个 .SaveAs,它不会转换 .xls 文件。
  • 我确定 Applecore 并不是要删除第二行...我认为他/她的意思是,如果您不想创建额外的 .xls 文件,则不能同时运行.这就是为什么它是我的答案的方式,所以只有一个会被执行,基于原始文件名条件......我希望你分析死亡的答案,当你从某人那里得到一个时,所以你知道为什么事情会这样发生。

标签: excel vba csv


【解决方案1】:

如果你改变这个:

ActiveWorkbook.SaveAs Filename:=OutputFolder & "\" & Replace(ActiveWorkbook.Name, ".xlsx", ".csv"), FileFormat:=xlCSV, CreateBackup:=False
ActiveWorkbook.SaveAs Filename:=OutputFolder & "\" & Replace(ActiveWorkbook.Name, ".xls", ".csv"), FileFormat:=xlCSV, CreateBackup:=False

到那个:

--- 在将 VBA 代码块保存为 .csv 之前从 Workbook 中删除它们,我使用了 this stackoverflow answer,然后我使用来自 here 的信息检查了它是否有意义 ---

Dim StartWb As Workbook
Dim TempWb As Workbook

Set StartWb = ActiveWorkbook
Set TempWb = Application.Workbooks.Add
StartWb.Worksheets("Sheet1").Copy Before:=TempWb.Worksheets(1)

If TempWb.Worksheets.Count > 1 Then
    Do While (TempWb.Worksheets.Count > 1)
        TempWb.Worksheets(TempWb.Worksheets.Count).Delete
    Loop
End If

' ----- This is new to delete the codeblocks from your Sheets -----------
Dim Element As Object
For Each Element In TempWb.VBProject.VBComponents
    'For Each Item In Element.Collection ' This For loop wasn't needed at the and but I forgot it in
        Element.CodeModule.DeleteLines 1, Element.CodeModule.CountOfLines
    'Next   ' It has most likely thrown up Undeclared Variable error with Option Eplicit
Next
' -----------------------------------------------------------------------

If InStr(StartWb.Name, ".xlsx") Then
    TempWb.SaveAs Filename:=OutputFolder & "\" & Replace(StartWb.Name, ".xlsx", ".csv"), FileFormat:=xlCSV, CreateBackup:=False
ElseIf InStr(StartWb.Name, ".xls") Then
    TempWb.SaveAs Filename:=OutputFolder & "\" & Replace(StartWb.Name, ".xls", ".csv"), FileFormat:=xlCSV, CreateBackup:=False
End If

TempWb.Close (xlNo)

那么您将只保存您的 .csv 文件,并且它只会包含第一个工作表。

我也会把这些:

Application.ScreenUpdating = True
Application.DisplayAlerts = True

在您的代码之前或之后的末尾:

Application.Calculation = xlCalculationAutomatic

也交换这个:

ActiveWorkbook.Close

到那个:

StartWb.Close (xlNo)

要通过代码从工作簿中删除代码,您必须更改 Excel 中的设置:

【讨论】:

  • 这太棒了,效果很好。我会接受你的回答。但是,.xls 文件有宏并且它正在创建一个编译错误 - “未定义用户定义的类型”。所以我需要想办法先把这些文件中的默认宏去掉,然后运行代码,任务就完成了。谢谢!
  • 非常感谢您的帮助。我不是 VBA 编码器,但自从过去 2 周以来我学到了很多。我至少打开了 57 个选项卡来修复失败的代码块。请不要采取其他方式。不幸的是,您添加的代码失败了。运行时错误 1004:对 VB 项目的编程访问不受信任。也没有定义“项目”,所以我将项目定义为一个对象。我现在正在研究更多关于我面临的错误。谢谢!
  • 谢谢!错误得到解决。但是......对于 .xls 文件,它仍然无法正常工作。这是我看到的:imgur.com/a/c7X0m3C
  • 您的代码和建议运行良好。我注释掉了额外的循环,但得到了同样的错误。我运行宏并弹出错误(imgur.com/a/c7X0m3C)。直到我点击“OK”,它才会停留在那里,一旦我点击 OK,它就会给我预期的 .csv 输出。但是,我点击了“帮助”,它说:“贵组织的政策阻止我们为您完成此操作。欲了解更多信息,请联系您的服务台。我不认为我们可以进一步做任何事情。我对我目前所拥有的解决方案感到满意。请接受我真诚的感谢您的帮助。
  • 不客气...这对您来说可能很明显,但我只需要问:错误消息似乎与Sheet2(代码)中的m_objHTMLDocument As HTMLDocument 行有关。那么这是否意味着没有 HTMLDocument 内置类型?但是您说 .xls 是它无法使用的...您是否尝试过在尝试使用您的 .xls 文件之一执行时单步调试代码?
猜你喜欢
  • 1970-01-01
  • 2018-04-28
  • 2017-08-21
  • 2019-03-13
  • 2018-07-11
  • 2021-08-26
  • 2021-08-20
  • 1970-01-01
  • 2019-10-26
相关资源
最近更新 更多