2011-03-30 6 views
6

Mi función es la siguiente:¿Por qué VBA ActiveWorkbook.SaveAs cambia la hoja de cálculo abierta?

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

Estoy tratando de exportar la hoja de cálculo activa a CSV. Cuando ejecuto el código en el título, Book1.xlsm cambia a file.csv y Sheet1 cambia a archivo. La exportación funciona bien. ¿Cómo puedo exportar sin estos efectos secundarios no deseados?

Respuesta

6

Así es como funciona SaveAs. La única forma de evitar esto es copiar la hoja de trabajo y hacer un SaveAs en la copia, luego ciérrelo.

EDIT: Debo añadir un ejemplo, ya que no es tan difícil de hacer. Aquí hay un ejemplo rápido que copia el ActiveSheet en un nuevo libro de trabajo.

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 

Un libro de trabajo complicado puede tener problemas con enlaces y macros, pero en situaciones normales esto es seguro.

EDIT 2: Soy consciente de lo que estás tratando de hacer, ya que tu otra pregunta era sobre intentar activar una exportación en cada cambio de la hoja. Este enfoque de hoja de copia que se presenta aquí probablemente sea altamente perturbador.

Mi sugerencia es escribir un archivo CSV a mano para minimizar la interrupción de la GUI. Es probable que la hoja quede inutilizable si los resguardos se producen a alta frecuencia. No me echaré la culpa de esto en la puerta de Excel, simplemente no fue construido para guardar rápidamente detrás de escena.

0

Aquí hay una pequeña rutina que hace lo que quiere al operar en una copia de la copia original hecha a través de un objeto de creación de scripts. Hardcoded para operar en "ThisWorkbook" en lugar de libro activo & presume ".xlsm" sufijo - podría modificar este para hacer el trabajo que pienso:

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 
Cuestiones relacionadas