호출 워크북을 닫지 않고 VBA SaveAs를 사용하는 방법은 무엇입니까?
원하는 항목:
- 템플릿 워크북을 사용하여 데이터 조작 수행
- 이 워크북의 복사본을 .xlsx로 저장(SaveCopyAs는 파일 형식을 변경할 수 없습니다. 그렇지 않으면 이 방법이 좋습니다.)
- 원본 템플릿("저장된" 템플릿이 아님)을 계속 표시합니다)
사용.SaveAs
에서는 매크로를 제거하는 동안 워크북을 저장하고 새로 생성된 SavedAs 워크북의 보기를 표시합니다.
유감스럽게도 이는 다음을 의미합니다.
- 매크로 사용 워크북을 다시 열지 않으면 더 이상 볼 수 없는 경우
- 이 시점에서 코드 실행이 중지되는 이유는 다음과 같습니다.
- 저장하는 것을 잊어버린 경우 매크로 변경사항은 삭제됩니다(참고: 프로덕션 환경에서는 이 작업은 괜찮지만 개발에는 큰 부담이 됩니다).
제가 이걸 할 수 있는 방법이 있을까요?
'current code
Application.DisplayAlerts = False
templateWb.SaveAs FileName:=savePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
templateWb.Activate
Application.DisplayAlerts = True
'I don't really want to make something like this work (this fails, anyways)
Dim myTempStr As String
myTempStr = ThisWorkbook.Path & "\" & ThisWorkbook.Name
ThisWorkbook.Save
templateWb.SaveAs FileName:=savePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
ActiveWorkbook.Close
Workbooks.Open (myTempStr)
'I want to do something like:
templateWb.SaveCopyAs FileName:=savePath, FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False 'SaveCopyAs only takes one argument, that being FileName
또한 참고:SaveCopyAs
다른 유형으로 저장할 수 있습니다(즉,templateWb.SaveCopyAs FileName:="myXlsx.xlsx"
파일 형식이 잘못되었기 때문에 열 때 오류가 발생합니다.
여기에 사용하는 것보다 훨씬 빠른 방법이 있습니다..SaveCopyAs
복사본을 만든 다음 해당 복사본을 열고...으로 저장합니다.
제 의견에 언급된 바와 같이, 이 프로세스는 10개의 워크시트가 있는 워크북에서 xlsx 복사본을 만드는 데 약 1초가 걸립니다(각각 100개의 행 * 20개의 데이터).
Sub Sample()
Dim thisWb As Workbook, wbTemp As Workbook
Dim ws As Worksheet
On Error GoTo Whoa
Application.DisplayAlerts = False
Set thisWb = ThisWorkbook
Set wbTemp = Workbooks.Add
On Error Resume Next
For Each ws In wbTemp.Worksheets
ws.Delete
Next
On Error GoTo 0
For Each ws In thisWb.Sheets
ws.Copy After:=wbTemp.Sheets(1)
Next
wbTemp.Sheets(1).Delete
wbTemp.SaveAs "C:\Blah Blah.xlsx", 51
LetsContinue:
Application.DisplayAlerts = True
Exit Sub
Whoa:
MsgBox Err.Description
Resume LetsContinue
End Sub
저는 Siddharth가 제안한 것과 유사한 것을 했고 그것을 할 수 있는 기능을 작성했고 약간의 짜증을 처리하고 좀 더 유연성을 제공했습니다.
Sub saveExample()
Application.ScreenUpdating = False
mySaveCopyAs ThisWorkbook, "C:\Temp\testfile2", xlOpenXMLWorkbook
Application.ScreenUpdating = True
End Sub
Private Function mySaveCopyAs(pWorkbookToBeSaved As Workbook, pNewFileName As String, pFileFormat As XlFileFormat) As Boolean
'returns false on errors
On Error GoTo errHandler
If pFileFormat = xlOpenXMLWorkbookMacroEnabled Then
'no macros can be saved on this
mySaveCopyAs = False
Exit Function
End If
'create new workbook
Dim mSaveWorkbook As Workbook
Set mSaveWorkbook = Workbooks.Add
Dim initialSheets As Integer
initialSheets = mSaveWorkbook.Sheets.Count
'note: sheet names will be 'Sheet1 (2)' in copy otherwise if
'they are not renamed
Dim sheetNames() As String
Dim activeSheetIndex As Integer
activeSheetIndex = pWorkbookToBeSaved.ActiveSheet.Index
Dim i As Integer
'copy each sheet
For i = 1 To pWorkbookToBeSaved.Sheets.Count
pWorkbookToBeSaved.Sheets(i).Copy After:=mSaveWorkbook.Sheets(mSaveWorkbook.Sheets.Count)
ReDim Preserve sheetNames(1 To i) As String
sheetNames(i) = pWorkbookToBeSaved.Sheets(i).Name
Next i
'clear sheets from new workbook
Application.DisplayAlerts = False
For i = 1 To initialSheets
mSaveWorkbook.Sheets(1).Delete
Next i
'rename stuff
For i = 1 To UBound(sheetNames)
mSaveWorkbook.Sheets(i).Name = sheetNames(i)
Next i
'reset view
mSaveWorkbook.Sheets(activeSheetIndex).Activate
'save and close
mSaveWorkbook.SaveAs FileName:=pNewFileName, FileFormat:=pFileFormat, CreateBackup:=False
mSaveWorkbook.Close
mySaveCopyAs = True
Application.DisplayAlerts = True
Exit Function
errHandler:
'whatever else you want to do with error handling
mySaveCopyAs = False
Exit Function
End Function
Excel VBA에는 이 과정이 예쁘거나 좋은 것은 없지만 아래와 같은 것이 있습니다.이 코드는 오류를 잘 처리하지 못하고 보기 흉하지만 작동해야 합니다.
워크북을 복사하고 복사본을 열고 다시 저장한 다음 복사본을 삭제합니다.임시 복사본은 로컬 임시 디렉토리에 저장되며, 이 디렉토리에서도 삭제됩니다.
Option Explicit
Private Declare Function GetTempPath Lib "kernel32" _
Alias "GetTempPathA" (ByVal nBufferLength As Long, _
ByVal lpBuffer As String) As Long
Public Sub SaveCopyAs(TargetBook As Workbook, Filename, FileFormat, CreateBackup)
Dim sTempPath As String * 512
Dim lPathLength As Long
Dim sFileName As String
Dim TempBook As Workbook
Dim bOldDisplayAlerts As Boolean
bOldDisplayAlerts = Application.DisplayAlerts
Application.DisplayAlerts = False
lPathLength = GetTempPath(512, sTempPath)
sFileName = Left$(sTempPath, lPathLength) & "tempDelete_" & TargetBook.Name
TargetBook.SaveCopyAs sFileName
Set TempBook = Application.Workbooks.Open(sFileName)
TempBook.SaveAs Filename, FileFormat, CreateBackup:=CreateBackup
TempBook.Close False
Kill sFileName
Application.DisplayAlerts = bOldDisplayAlerts
End Sub
저도 비슷한 프로세스를 가지고 있습니다. 여기 제가 사용하는 솔루션이 있습니다.사용자는 템플릿을 열고, 조작을 수행하고, 템플릿을 어딘가에 저장한 다음 원래 템플릿을 열 수 있습니다.
- 사용자가 매크로 사용 템플릿 파일 열기
- 조종하다, 조종하다, 조종하다, 조종하다, 조종하다, 조종하다, 조종.
- Active Workbook의 파일 경로(템플릿 파일) 저장
- 다른 이름으로 저장 실행
- Active Workbook(지금은 파일로 저장)을 변수로 설정합니다.
- 3단계에서 템플릿 파일 경로 열기
- 5단계에서 변수를 닫습니다.
코드는 다음과 같습니다.
'stores file path of activeworkbook BEFORE the SaveAs is executed
getExprterFilePath = Application.ActiveWorkbook.FullName
'executes a SaveAs
ActiveWorkbook.SaveAs Filename:=filepathHere, _
FileFormat:=51, _
Password:="", _
WriteResPassword:="", _
ReadOnlyRecommended:=False, _
CreateBackup:=False
'reenables alerts
Application.DisplayAlerts = True
'announces completion to user
MsgBox "Export Complete", vbOKOnly, "List Exporter"
'sets open file (newly created file) as variable
Set wbBLE = ActiveWorkbook
'opens original template file
Workbooks.Open (getExprterFilePath)
'turns screen updating, calculation, and events back on
With Excel.Application
.ScreenUpdating = True
.Calculation = Excel.xlAutomatic
.EnableEvents = True
End With
'closes saved export file
wbBLE.Close
다른 옵션(최신 버전의 Excel에서만 테스트됨)
.SaveAs
.xlsx
그래서 당신은 두 개를 할 수 있습니다.SaveAs
워크북을 닫지 않고 빠르게 연속적으로 실행할 수 있습니다.
ActiveWorkbook.SaveAs FileFormat:=xlOpenXMLWorkbook, CreateBackup:=False
Application.DisplayAlerts = False
ActiveWorkbook.SaveAs FileFormat:=xlOpenXMLWorkbookMacroEnabled, CreateBackup:=False, ConflictResolution:=xlLocalSessionChanges
Application.DisplayAlerts = True
참고: 전원을 꺼야 합니다.DisplayAlerts
두 번째 저장 시 워크북이 이미 존재한다는 경고를 받지 않도록 합니다.
엔더랜드의 멋진 해결책.조금 달랐던 저의 고민을 공유해볼까 생각했습니다.엑셀에서 자료를 읽었습니다.엑셀 테이블의 각 행에 대해 워드 템플릿 문서를 엽니다.그런 다음 Excel의 데이터를 삽입합니다.그런 다음 템플리트를 변경하지 않고 새 단어 문서에 저장합니다.makro를 실행하는 동안 해당 단어 문서가 닫혔을 때 잘 작동했습니다.하지만 그 중 일부가 열려 있을 때, 그것은 기본적으로 아무것도 저장하지 못했습니다.
제가 한 일은 먼저 일부 Word 앱이 이미 실행 중인지 확인하고, 실행 중인 경우 사용합니다.
'Start Word and add a new document, but if word is already running use it
Set wd = GetObject(, "Word.Application")
If wd Is Nothing Then
Set wd = New Word.Application
End If
그런 다음 도움말 문자열 변수 "templ"을 사용합니다.FName"은 기본적으로 단어 템플릿 파일의 이름을 포함합니다.단순화를 위해 내가 생성하는 모든 출력 워드 문서를 다음과 같이 지정합니다.
templFName & "some unique suffix" & ".docx"
그런 다음 내가 사용하는 워드 문서(템플릿 1 또는 출력 1)가 이미 열려 있는지 확인하고, 열려 있으면 닫으십시오(첫 번째 단계의 참조 사용).
'close word document if already opened
Dim aDoc As Document
For Each aDoc In Documents
If InStr(1, aDoc.Name, templFName, 1) Then
aDoc.ActiveWindow.Close
Set aDoc = Nothing
End If
Next aDoc
그런 다음 단어 응용 프로그램을 종료하고 새 단어 응용 프로그램을 엽니다.
wd.Quit
Set wd = Nothing
Set wd = New Word.Application
바로 그거야.이 마지막 단계는 makro를 실행하기 전에 출력 단어 문서가 창에 열려 있는 경우를 대비하여 제 문제를 해결했습니다.언젠가 누군가에게 도움이 되길 바랍니다.좋은 하루 되세요.
언급URL : https://stackoverflow.com/questions/18899824/how-to-use-vba-saveas-without-closing-calling-workbook
'programing' 카테고리의 다른 글
매개 변수를 허용하는 expressjs 미들웨어 생성 (0) | 2023.08.08 |
---|---|
정규식 빈 문자열 또는 전자 메일 (0) | 2023.08.08 |
상위 div를 기준으로 "위치: 고정" div의 너비 설정 (0) | 2023.08.08 |
jQuery로 select 옵션의 레이블을 가져오는 방법은 무엇입니까? (0) | 2023.08.08 |
스프링 부트 외부 구성 (0) | 2023.08.08 |