使用VB将Excel工作表保存为CSV文件,文件名包括工作表名称

31

我对VB编程非常陌生,我正在尝试将多个Excel文件工作表保存为csv格式,但我不知道如何处理多个工作表,不过我找到了一种单个文件处理的方法。我在这个网站上找到了很有用的代码,唯一的问题是文件以工作表名称保存,但我想要它们以原始文件和工作表名称保存,例如文件名_工作表名称,我尝试自己实现但总是出错,请问我做错了什么?

我正在使用的代码如下:

   Public Sub SaveWorksheetsAsCsv()

   Dim WS As Excel.Worksheet
   Dim SaveToDirectory As String

   Dim CurrentWorkbook As String
   Dim CurrentFormat As Long

   CurrentWorkbook = ThisWorkbook.FullName
   CurrentFormat = ThisWorkbook.FileFormat
   ' Store current details for the workbook
   SaveToDirectory = "H:\test\"
   For Each WS In ThisWorkbook.Worksheets
   WS.SaveAs SaveToDirectory & WS.Name, xlCSV
   Next

Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
Application.DisplayAlerts = True
' Temporarily turn alerts off to prevent the user being prompted
'  about overwriting the original file.

End Sub 
5个回答

47

我认为这就是你想要的...

Sub SaveWorksheetsAsCsv()

Dim WS As Excel.Worksheet
Dim SaveToDirectory As String

Dim CurrentWorkbook As String
Dim CurrentFormat As Long

CurrentWorkbook = ThisWorkbook.FullName
CurrentFormat = ThisWorkbook.FileFormat
' Store current details for the workbook
SaveToDirectory = "H:\test\"

For Each WS In Application.ActiveWorkbook.Worksheets
    WS.SaveAs SaveToDirectory & WS.Name, xlCSV
Next

Application.DisplayAlerts = False
ThisWorkbook.SaveAs Filename:=CurrentWorkbook, FileFormat:=CurrentFormat
Application.DisplayAlerts = True
' Temporarily turn alerts off to prevent the user being prompted
'  about overwriting the original file.

End Sub

单元格的格式怎么样?如果日期类型的单元格格式为DD/MM,那么将其保存为CSV文件后,结果仍然是DD/MM,年份部分会被省略。请问你能给予建议吗? - bjan
1
是的,这就是CSV的工作原理。它会剥离除了单元格显示为纯文本的值以外的所有内容。我不太确定你在问什么,但如果你打开一个新问题并在评论中链接它,我很乐意为你查看。 - Ben Strombeck
1
我已将Windows7的行分隔符更改为“;”,但是此宏保存的 .csv 文件却使用“,”作为分隔符。有什么方法可以解决这个问题吗? - RogueDeus
1
你是说你已经尝试过这篇文章里的方法了吗?http://social.technet.microsoft.com/wiki/contents/articles/10305.how-to-convert-format-excel-to-csv-with-semicolon-delimited.aspx 我在我的Windows 7机器上试过了,它有效。 - Ben Strombeck
1
@D.Tate,别担心!不用谢。感谢你让我知道它对你有用。那总是让人感觉很好!不用担心,在SO上的所有代码都可以免费使用,而且你不需要做任何归属 :-) - Ben Strombeck
显示剩余5条评论

9
我遇到了类似的问题。我需要将工作表中的数据保存为单独的CSV文件。
这是我的命令按钮代码:
Private Sub cmdSave()
    Dim sFileName As String
    Dim WB As Workbook

    Application.DisplayAlerts = False

    sFileName = "MyFileName.csv"
    'Copy the contents of required sheet ready to paste into the new CSV
    Sheets(1).Range("A1:T85").Copy 'Define your own range

    'Open a new XLS workbook, save it as the file name
    Set WB = Workbooks.Add
    With WB
        .Title = "MyTitle"
        .Subject = "MySubject"
        .Sheets(1).Select
        ActiveSheet.Paste
        .SaveAs "MyDirectory\" & sFileName, xlCSV
        .Close
    End With

    Application.DisplayAlerts = True
End Sub

这对我来说很有效 :-)

2

你是想做这件事吗?

Option Explicit

Public Sub SaveWorksheetsAsCsv()
    Dim WS As Worksheet
    Dim SaveToDirectory As String, newName As String

    SaveToDirectory = "H:\test\"

    For Each WS In ThisWorkbook.Worksheets
        newName = GetBookName(ThisWorkbook.Name) & "_" & WS.Name
        WS.Copy
        ActiveWorkbook.SaveAs SaveToDirectory & newName, xlCSV
        ActiveWorkbook.Close Savechanges:=False
    Next
End Sub

Function GetBookName(strwb As String) As String
    GetBookName = Left(strwb, (InStrRev(strwb, ".", -1, vbTextCompare) - 1))
End Function

嗨,Siddharth,我按照你的建议尝试了,但仍然出现错误,不过没关系,另一个答案更符合我的需求,非常感谢你提供帮助 :) - Achak
当然没问题,但我想知道你遇到了什么错误,因为我发布的代码经过尝试和测试,可以实现你想要的功能 :) - Siddharth Rout

1

最好的方法是记录宏并执行确切的步骤,查看生成的VBA代码。然后,您可以去替换您想要通用化的部分(例如文件名等)


1
上面的代码完美运行,只有一个小缺陷; 生成的文件没有以.csv扩展名保存。 - Tensigh 2天前
我添加了以下内容到代码中,它将我的文件保存为csv。感谢这段代码。一切都按预期工作。
ActiveWorkbook.SaveAs Filename:=SaveToDirectory & ThisWorkbook.Name & "-" & WS.Name & ".csv", FileFormat:=xlCSV

这并没有提供问题的答案。如果要批评或请求作者澄清,请在他们的帖子下留言 - 您始终可以在自己的帖子上发表评论,并且一旦您拥有足够的声望,您将能够评论任何帖子 - Artjom B.
我把你的代码注释添加到了适当的位置。 - Artjom B.

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