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

时间:2011-03-30 08:16:18

标签: 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更改为文件。出口工作正常。如何在没有这些不良副作用的情况下进行导出?

2 个答案:

答案 0 :(得分:6)

这一直是SaveAs的工作方式。解决这个问题的唯一方法是复制工作表并在副本上执行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的门口为此负责,它根本不是为了在幕后进行快速保存而构建的。

答案 1 :(得分:0)

这是一个通过文件脚本对象制作的原始副本复制操作来完成所需操作的小程序。硬编码操作“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