【问题标题】:VBA Saving single sheet as CSV (not whole workbook)VBA 将单张工作表另存为 CSV(不是整个工作簿)
【发布时间】:2016-03-13 08:42:50
【问题描述】:

我很欣赏有很多像save individual excel sheets as csv 这样的条目 和Export each sheet to a separate csv file - 但我想在工作簿中保存一个单个工作表

我的 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

【问题讨论】:

  • 如果您使用 Worksheet.Copy 方法,而不设置粘贴目标,Excel 会将其作为新工作簿打开,仅包含该工作表。在 Worksheet.Copy 之后,您可以简单地使用 ActiveWorkbook,因为复制的工作表工作簿成为活动工作簿,并从那里将其保存为新的 CSV 文件。
  • 太棒了 - 2500 次观看,没有一票...

标签: vba excel


【解决方案1】:

您只需将工作簿另存为 CSV 文件。 Excel 会弹出一个对话框警告您正在保存到单个工作表,但您可以使用 Application.DisplayAlerts = False. 取消警告

不要忘记将其恢复为真。

【讨论】:

  • 谢谢@PaulG。我习惯于在 Excel 中手动执行该提示,但代码正在重命名我的文件而没有提示,这很奇怪
  • ActiveWorkbook.SaveAs... 正在保存工作表(提示文件将被覆盖),但它还将我的 xlsm 母船文件重命名为根目录中的 csv 文件名!所以我还是卡住了
  • 嗯,您确定将文件正确重命名为 csv(带有 CSV 扩展名?因此,如果原始工作簿是 Book1.xlsx,请尝试类似:ActiveWorkbook.SaveAs Filename:="c: \temp\Book1.csv", FileFormat:=xlCSVMSDOS, CreateBackup:=False
  • 是的,文件名是“unitprices.csv”,前面有完整路径。它保存在 strPath 中,并用这个名称和扩展名重命名我的 xlsm 文件(在另一个位置)。可能是使用 Thisworkbook 设置 S2 的错误...?
  • 这很奇怪,如果您尝试使用不同的 csv 名称会发生​​什么。尝试另存为 Test.csv。这会重命名原始 xlsx 文件吗?
【解决方案2】:

这段代码对我来说很好用。

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
  • 这只是一个草稿,所以请随意使用它:) 上面的代码不需要删除 s2,因为它不会首先创建 s2。
  • 优秀的答案,亚历克斯。它有很大帮助。我将添加复制命令创建一个名为“Book1.xlsx”的新工作簿,其中只有复制的工作表。该新工作簿成为 ActiveWorkbook。一旦你关闭它,ActiveWorkbook 就会再次成为你原来的代码运行工作簿,它仍然是打开的并且没有改变。
  • 对于那些想知道CreateBackup:=True 的用途的人,它会创建SaveAs 调用覆盖的CSV 文件的备份(对我来说它被称为“myfile.xlk 的备份”)
  • 如果您想制作 CSV 文件以便将其转换为 ICS 文件(用于日历目的),您需要文件格式FileFormat:=xlCSVMSDOS
【解决方案3】:

这是相当通用的

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 特别要求在工作簿中导出仅一张工作表
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-11
  • 2019-04-04
相关资源
最近更新 更多