VBA保存单个工作表为CSV格式(而不是整个工作簿)

30

我知道有许多像将单独的Excel工作表保存为csv将每个工作表导出为单独的csv文件这样的条目-但我想要保存工作簿中的单个工作表

我的xlsm文件中有一个参数和数据表。我创建了一个数据工作表副本并粘贴了值,然后想将其保存为csv。目前,整个工作簿的名称都会更改,并变成csv。

如何在Excel工作簿中“另存为CSV”单个工作表?

是否有Worksheet.SaveAs,还是我必须将我的数据表移动到另一个工作簿中并以那种方式保存它?

代码示例

' [Sample so some DIMs and parameters passed in left out] 
Dim s1 as Worksheet
Dim s2 as Worksheet

Set s1 = ThisWorkbook.Sheets(strSourceSheet)
' copy across
s1.Range(s1.Cells(1, 1), s1.Cells(lastrow, lastcol)).Copy

' Create new empty worksheet for holding values
Set s2 = Worksheets.Add

s2.Range("A1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats

' save sheet
s2.Activate
strFullname = strPath & strFilename


' >>> BIT THAT NEEDS FIXIN'
s2.SaveAs Filename:=strFullname, _
     FileFormat:=xlCSV, CreateBackup:=True

' Can I do Worksheets.SaveAs?

使用Windows 10和Office 365


5
如果您使用Worksheet.Copy方法而没有设置粘贴目的地,Excel会将它作为新工作簿打开,仅包含该工作表。在使用Worksheet.Copy之后,您只需使用ActiveWorkbook即可,因为复制的工作表所在的工作簿将成为活动工作簿,然后将其另存为新的CSV文件即可。 - Vulthil
1
太神奇了- 2500次浏览却没有一个投票... - micstr
4个回答

35

这段代码对我来说运行良好。

Sub test()

Application.DisplayAlerts = False

ThisWorkbook.Sheets(strSourceSheet).Copy
ActiveWorkbook.SaveAs Filename:=strFullname, FileFormat:=xlCSV, CreateBackup:=True
ActiveWorkbook.Close

Application.DisplayAlerts = True

End Sub

该代码会将整个 strSourceSheet 工作表复制一份到一个新的工作簿中,我们可以将其保存为 .csv 文件,并关闭这个新保存的 .csv 文件,不会影响原始文件的文件名。


感谢@Alex4336。我添加到关闭。 ActiveWorkbook.Close SaveChanges:=False#并在xlsm中删除临时工作表 s2.Delete - micstr
那只是一个快速草稿,所以请随意使用它 :) 上述代码不需要删除s2,因为它首先不会创建s2。 - Vulthil
1
非常好的回答,Alex。它帮了我很多。我只想补充一下,复制命令会创建一个名为“Book1.xlsx”的新工作簿,其中只包含复制的工作表。这个新工作簿成为ActiveWorkbook。一旦你关闭它,ActiveWorkbook再次变成你原来运行代码的工作簿,它仍然是打开且未更改的。 - Karl Hoaglund
1
对于那些想知道 CreateBackup:=True 是什么意思的人,它会创建一个 CSV 文件的备份,以便在 SaveAs 调用覆盖该文件时使用(对我来说,它被称为“myfile.xlk 的备份”)。 - Nickolay
如果你想将CSV文件转换为ICS文件(用于日历目的),你需要使用文件格式FileFormat:= xlCSVMSDOS - Marie. P.

7

这是相当通用的

Sub WriteCSVs()

Dim mySheet As Worksheet
Dim myPath As String

'Application.DisplayAlerts = False

For Each mySheet In ActiveWorkbook.Worksheets

    myPath = "\\myserver\myfolder\"

    ActiveWorkbook.Sheets(mySheet.Index).Copy
    ActiveWorkbook.SaveAs Filename:=myPath & mySheet.Name, FileFormat:=xlCSV, CreateBackup:=True
    ActiveWorkbook.Close

Next mySheet

'Application.DisplayAlerts = True

End Sub

虽然这段代码可能有效,但OP明确要求仅导出工作簿中的一个表格。 - Marcucciboy2

3

您只需要将工作簿保存为CSV文件即可。

Excel会弹出一个对话框警告,提示您正在保存到单个工作表,但您可以使用 Application.DisplayAlerts = False 来关闭警告。

但别忘了重新设置为true。


谢谢 @PaulG。我习惯于在Excel中手动操作时收到提示,但是代码会无提示地重命名我的文件,这很奇怪。 - micstr
ActiveWorkbook.SaveAs...正在保存工作表(并提示将覆盖文件),但它也将我的xlsm母版文件重命名为根目录中的csv文件名!所以我仍然卡住了。 - micstr
你确定你正在正确地将文件重命名为 CSV 格式吗?如果原始工作簿是 Book1.xlsx,那么请尝试以下操作:ActiveWorkbook.SaveAs Filename:="c:\temp\Book1.csv", FileFormat:=xlCSVMSDOS, CreateBackup:=False。 - PaulG
原始的xlsm工作簿与csv文件名不同,但它仍然重命名它。看起来我必须做新工作簿的事情。 - micstr
哦,我明白了 - 我的错误是我没有意识到你想要原始文件和副本。你只需要保存一个副本,但要保存为CSV文件。类似这样:ActiveWorkbook.SaveCopyAs Filename:="C:\Temp\Book1.csv" - PaulG
显示剩余2条评论

2
几年后再来看这个问题,我找到了一种对我更好的方法。这是因为我要保存的工作表很大且充满计算,将它们复制到新工作表需要不方便的时间。
为了加快进程,它会保存当前工作表,然后简单地重新打开它,关闭不需要的.csv窗口:
Sub SaveThisSheetInParticular()

Dim path As String
path = ThisWorkbook.FullName
Application.DisplayAlerts = False

Worksheets("<Sheet Name>").SaveAs Filename:=ThisWorkbook.path & "\<File Name>", FileFormat:=xlCSV

Application.Workbooks.Open (path)
Application.DisplayAlerts = True
Workbooks("<File Name>.csv").Close

End Sub

这里的工作表和csv文件名是硬编码的,因为除了宏创建者(也就是我)以外,没有人应该去修改它们。然而,它可以很容易地改为存储和使用活动工作表名称,以便在调用宏时导出当前工作表。

请注意,您可以对多个工作表执行此操作,只需在关闭语句中使用最后一个文件名即可:

Worksheets("<Sheet 1>").SaveAs Filename:=ThisWorkbook.path & "\<File 1>", FileFormat:=xlCSV
Worksheets("<Sheet 2>").SaveAs Filename:=ThisWorkbook.path & "\<File 2>", FileFormat:=xlCSV

[...]

Workbooks("<File 2>.csv").Close

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