2011-03-30 2 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 

복잡한 통합 문서는 링크 및 매크로에 문제가 발생할 수 있지만 일반적인 시나리오에서는 안전합니다.

EDIT 2 : 다른 질문은 시트에 대한 모든 변경 사항에 대해 내보내기를 실행하는 것이 었습니다. 여기에 제시된이 카피 시트 접근법은 매우 파괴적 일 수 있습니다.

내 제안은 GUI 중단을 최소화하기 위해 직접 CSV 파일을 작성하는 것입니다. 저장 용지가 높은 빈도로 발생하면 용지를 사용할 수 없게 될 수 있습니다. 나는 엑셀의 문앞에서 이런 비난을하지 않았을 것이고, 단순히 장면 뒤에 숨겨진 빠른 저장을 위해 지어지지 않았다.

0

다음은 파일 스크립트 개체를 통해 원본 복사본을 복사하여 원하는대로 작업하는 약간의 루틴입니다. 현재 통합 문서에 &는 ".xlsm"접미사 가정에 반대 "에서 ThisWorkbook"에서 작동하도록 하드 코딩 - 일을하려면이 옵션을 조정할 수를 생각 :

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 
관련 문제