如何将多个工作表导出为CSV(不覆盖当前的工作表)

5
我正在尝试使用以下代码将工作簿中的多个工作表导出为 .csv 文件:

Sub Export_To_CSV(exportPath As String)    

    Dim filePath As String 

    For Each WS In ThisWorkbook.Worksheets

            filePath = exportPath & "(" & WS.Name & ").dat"
            WS.SaveAs Filename:=filePath, FileFormat:=xlCSV

    Next 
End Sub

问题在于这会覆盖我当前已打开的.xlsm文件。
如何导出.csv而不更改当前文件名?
我以为SaveCopyAs可以解决问题,但它只适用于workbook而不适用于worksheet
2个回答

8

这里有一个想法可以帮助您…… 在当前的for...next部分中添加以下代码:

'...your code here
Dim tmpWS As Worksheet
Application.DisplayAlerts = False
For Each WS In ThisWorkbook.Worksheets

        filePath = exportPath & "(" & WS.Name & ").dat"

        WS.Copy
        Set tmpWS = ActiveSheet
        tmpWS.SaveAs Filename:=filePath, FileFormat:=xlCSV
        tmpWS.Parent.Close False
Next
Application.DisplayAlerts = True
'...your code here

代码逻辑是什么?首先,它将您的工作表复制到临时工作簿中,然后将新工作表保存为 CSV 文件,最后关闭临时工作簿。此外,我添加了 Application.DisplayAlerts 指令,使您的代码在不询问文件是否已存在的情况下覆盖 .csv 文件。


我正准备着写同样的答案,所以点个赞。 - K_B
太棒了。聪明的想法是让它使用临时工作簿,而不是试图阻止SaveAs做它想做的事情! - Tommy O'Dell

0

您也可以先保存工作簿,然后保存工作表,最后关闭工作簿而无需再次保存:

' ... your code here
    ActiveWorkbook.Save
    Application.DisplayAlerts = False

Dim WS As Worksheet

For Each WS In Worksheets
        Filepath = "c:\temp\" & WS.Name & ".dat"
        WS.SaveAs Filename:=Filepath, FileFormat:=xlCSV, _
        CreateBackup:=False
Next
    ActiveWorkbook.Close
' ... your code here

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接