2011-03-30 74 views
6

我的功能如下:爲什麼VBA ActiveWorkbook.SaveAs更改打開的電子表格?

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

我想活動工作表導出爲CSV。當我在標題中運行代碼時,Book1.xlsm更改爲file.csv,Sheet1更改爲文件。出口工作正常。如何在沒有這些不需要的副作用的情況下進行導出?

回答

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的門口指責這一點,它並不是爲在幕後完成的快速保存而構建的。

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 
相關問題