programing

호출 워크북을 닫지 않고 VBA SaveAs를 사용하는 방법은 무엇입니까?

javamemo 2023. 8. 8. 19:57
반응형

호출 워크북을 닫지 않고 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

저도 비슷한 프로세스를 가지고 있습니다. 여기 제가 사용하는 솔루션이 있습니다.사용자는 템플릿을 열고, 조작을 수행하고, 템플릿을 어딘가에 저장한 다음 원래 템플릿을 열 수 있습니다.

  1. 사용자가 매크로 사용 템플릿 파일 열기
  2. 조종하다, 조종하다, 조종하다, 조종하다, 조종하다, 조종하다, 조종.
  3. Active Workbook의 파일 경로(템플릿 파일) 저장
  4. 다른 이름으로 저장 실행
  5. Active Workbook(지금은 파일로 저장)을 변수로 설정합니다.
  6. 3단계에서 템플릿 파일 경로 열기
  7. 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

반응형