为什么VBA ActiveWorkbook.SaveAs更改打开的电子表格?

我的function如下:

Sub saveCSV() Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:= _ "c:\temp\file.csv", FileFormat:=xlCSV _ , CreateBackup:=False End Sub 

我正在尝试将活动工作表导出为CSV。 当我在标题中运行代码时,Book1.xlsm更改为file.csv,Sheet1更改为文件。 出口工作正常。 我怎样才能做出口没有这些不必要的副作用?

这总是如何工作。 解决此问题的唯一方法是复制工作表并在副本上执行SaveAs,然后closures它。

编辑:我应该添加一个例子,因为它不是很难做到。 下面是一个将ActiveSheet复制到新工作簿的简单示例。

 Dim wbk As Workbook Set wbk = Workbooks.Add ActiveSheet.Copy wbk.Sheets(1) ' Copy activesheet before the first sheet of wbk wbk.SaveAs .... wbk.Close 

复杂的工作簿可能会遇到链接和macros的问题,但在一般情况下,这是安全的。

编辑2:我知道你想要做什么,因为你的另一个问题是关于试图触发一个出口的每一个变化的工作表。 这里介绍的这种复制方法很可能是非常具有破坏性的。

我的build议是手写一个CSV文件,以尽量减lessGUI中断。 如果保存频率很高,表格可能会变得不可用。 我不会把这个责任归咎于Excel的门槛,它不是为了在幕后进行快速的保存而构build的。

这是一个小程序,通过对原始副本进行操作,通过文件脚本对象进行复制。 硬编码在“ThisWorkbook”上运行,而不是在活动工作簿和推定“.xlsm”后缀 – 可以调整这个工作,我想:

 Public Sub SaveCopyAsCsv() Dim sThisFile As String: sThisFile = ThisWorkbook.FullName Dim sCsvFile As String: sTempFile = Replace(sThisFile, ".xlsm", "_TEMP.xlsm") ThisWorkbook.Save ' save the current workbook ' copy the saved workbook ABC.xlsm to TEMP_ABC.xlsm Dim fso As Object: Set fso = CreateObject("Scripting.FileSystemObject") On Error Resume Next Call fso.deletefile(sTempFile, True) ' deletes prev temp file if it exists On Error GoTo 0 Call fso.CopyFile(sThisFile, sTempFile, True) ' open the temp file & save as CSV Dim wbTemp As Workbook Set wbTemp = Workbooks.Open(sTempFile) ' open the temp file in excel ' your prev code to save as CSV Application.DisplayAlerts = False ActiveWorkbook.SaveAs FileName:="c:\temp\file.csv", FileFormat:=xlCSV, CreateBackup:=False wbTemp.Close ' close the temp file now that the copy has been made Application.DisplayAlerts = True ' delete the temp file (if you want) On Error Resume Next Call fso.deletefile(sTempFile, True) ' deletes the temp file On Error GoTo 0 End Sub