Excel:macros将工作表导出为CSV文件,而不会离开当前的Excel工作表

这里有很多问题需要创build一个macros来将工作表保存为一个CSV文件。 所有的答案都使用SaveAs,就像SuperUser的这个一样。 他们基本上说这样创build一个VBA函数:

Sub SaveAsCSV() ActiveWorkbook.SaveAs FileFormat:=clCSV, CreateBackup:=False End Sub 

这是一个很好的答案,但是我想做一个导出而不是另存为 。 当SaveAs被执行的时候会引起我两个烦恼:

  • 我目前的工作文件成为一个CSV文件。 我想继续使用原始的.xlsm文件,但是要将当前工作表的内容导出为具有相同名称的CSV文件。
  • 出现一个对话框,询问是否确认要重写CSV文件。

是否有可能将当前工作表导出为文件,而是继续使用原始文件?

@NathanClement有点快了。 然而,这里是完整的代码(稍微更详细):

 Option Explicit Public Sub ExportWorksheetAndSaveAsCSV() Dim wbkExport As Workbook Dim shtToExport As Worksheet Set shtToExport = ThisWorkbook.Worksheets("Sheet1") 'Sheet to export as CSV Set wbkExport = Application.Workbooks.Add shtToExport.Copy Before:=wbkExport.Worksheets(wbkExport.Worksheets.Count) Application.DisplayAlerts = False 'Possibly overwrite without asking wbkExport.SaveAs Filename:="C:\tmp\test.csv", FileFormat:=xlCSV Application.DisplayAlerts = True wbkExport.Close SaveChanges:=False End Sub 

几乎我想要的@Ralph。 你的代码有一些问题:

  1. 它只导出名为“Sheet1”的硬编码表;
  2. 它总是导出到相同的临时文件,覆盖它;
  3. 它忽略了区域设置分隔字符。

为了解决这些问题,并满足我所有的要求,我已经调整了这里的代码 。 我已经清理了一下,使其更具可读性。

 Option Explicit Sub ExportAsCSV() Dim MyFileName As String Dim CurrentWB As Workbook, TempWB As Workbook Set CurrentWB = ActiveWorkbook ActiveWorkbook.ActiveSheet.UsedRange.Copy Set TempWB = Application.Workbooks.Add(1) TempWB.Sheets(1).Range("A1").PasteSpecial xlPasteValues Dim Change below to "- 4" to become compatible with .xls files MyFileName = CurrentWB.Path & "\" & Left(CurrentWB.Name, Len(CurrentWB.Name) - 5) & ".csv" Application.DisplayAlerts = False TempWB.SaveAs Filename:=MyFileName, FileFormat:=xlCSV, CreateBackup:=False, Local:=True TempWB.Close SaveChanges:=False Application.DisplayAlerts = True End Sub 

上面的代码还有一些小问题,你应该注意:

  1. .CloseDisplayAlerts=True应该在finally子句中,但我不知道如何在VBA中执行
  2. 它只适用于当前文件名有4个字母,如.xlsm。 不会在.xls excel文件中工作。 对于3个字符的文件扩展名,在设置MyFileName时必须将- 5更改为-4。
  3. 作为一种附带效应,您的剪贴板将被replace为当前表单内容。

编辑:把Local:=True保存与我的区域设置CSV分隔符。

正如我所评论的,这个网站上有几个地方把工作表的内容写入CSV。 这一个和这个只是指出了两个。

以下是我的版本

  • 它明确地寻找“,”在一个单元格内
  • 它也使用UsedRange – 因为你想获得工作表中的所有内容
  • 使用数组进行循环,因为这比在工作表单元格中循环更快
  • 我没有使用FSO例程,但是这是一个选项

代码 …

 Sub makeCSV(theSheet As Worksheet) Dim iFile As Long, myPath As String Dim myArr() As Variant, outStr As String Dim iLoop As Long, jLoop As Long myPath = Application.ActiveWorkbook.Path iFile = FreeFile Open myPath & "\myCSV.csv" For Output Lock Write As #iFile myArr = theSheet.UsedRange For iLoop = LBound(myArr, 1) To UBound(myArr, 1) outStr = "" For jLoop = LBound(myArr, 2) To UBound(myArr, 2) - 1 If InStr(1, myArr(iLoop, jLoop), ",") Then outStr = outStr & """" & myArr(iLoop, jLoop) & """" & "," Else outStr = outStr & myArr(iLoop, jLoop) & "," End If Next jLoop If InStr(1, myArr(iLoop, jLoop), ",") Then outStr = outStr & """" & myArr(iLoop, UBound(myArr, 2)) & """" Else outStr = outStr & myArr(iLoop, UBound(myArr, 2)) End If Print #iFile, outStr Next iLoop Close iFile Erase myArr End Sub