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

Excel 为什么VBA ActiveWorkbook.SaveAs会更改打开的电子表格?,excel,vba,Excel,Vba,我的职能如下: Sub saveCSV() Application.DisplayAlerts = False ActiveWorkbook.SaveAs Filename:= _ "c:\temp\file.csv", FileFormat:=xlCSV _ , CreateBackup:=False End Sub 我正在尝试将活动工作表导出到CSV。当我运行标题中的代码时,Book1.xlsm更改为file.csv,Sheet1更改为file。出口产品运作

我的职能如下:

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

我正在尝试将活动工作表导出到CSV。当我运行标题中的代码时,Book1.xlsm更改为file.csv,Sheet1更改为file。出口产品运作良好。如何在没有这些不必要的副作用的情况下进行导出?

SaveAs一直都是这样工作的。解决这个问题的唯一方法是复制工作表并在副本上执行另存为,然后关闭它

编辑:我应该添加一个示例,因为这并不难做到。下面是一个将
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
复杂的工作簿可能会遇到链接和宏的问题,但在普通情况下,这是安全的

编辑2:我知道您正在尝试做什么,因为您的另一个问题是试图在对工作表的每次更改时触发导出。这里介绍的这种复印纸方法可能具有很强的破坏性


我的建议是手工编写一个CSV文件,以尽量减少GUI中断。如果保存的频率很高,则该工作表可能无法使用。我不会把这归咎于Excel,它根本不是为了在后台进行快速保存而构建的。

这里有一个小程序,可以通过对原始文件的副本进行操作来实现您的目的。。。通过文件脚本对象进行复制。硬编码操作“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