programing

Excel 매크로를 호출하고 매크로가 완료될 때까지 기다리는 VBA Outlook

css3 2023. 9. 27. 18:03

Excel 매크로를 호출하고 매크로가 완료될 때까지 기다리는 VBA Outlook

Outlook 규칙 스크립트에서 Excel 매크로를 호출합니다.

과정은 다음과 같습니다. 메일 가져오기, Outlook 스크립트를 실행하는 Outlook 규칙 실행, 해당 스크립트에서 Excel 열기, Excel 매크로 실행, Excel 닫기.

Excel 매크로가 완료되었음을 Outlook 규칙 스크립트에서 확인하여 응용 프로그램을 저장하고 닫습니다.

 Sub AskMeAlerts()
 Dim appExcel As Excel.Application 
 Dim wkb As Excel.Workbook 
 Set appExcel = CreateObject("Excel.Application") 
 appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
 appExcel.Visible = True 
 appExcel.Run "'Ask me question workflow.xlsm'!AskMeFlow" 
 appExcel.DisplayAlerts = False 
 appExcel.ActiveWorkbook.Save 
 appExcel.Quit Set appExcel = Nothing 
 Set wkb = Nothing 
 End Sub

둘 중 하나라도

  1. Excel 매크로를 Outlook으로 포팅하고 직접 실행
  2. 플래그를 사용하여 코드 완료 캡처

아래 코드는 첫 번째 시트의 A1에 있는 마커를 사용하여 실행 중인 코드(Excel 부분)를 잡습니다.당신의 코드도 알려드렸습니다(초기 바인딩과 후기 바인딩이 혼합되어 있었습니다).

아웃룩코드

 Sub AskMeAlerts()
 Dim appExcel As Excel.Application
 Set appExcel = New Excel.Application
 With appExcel
     .DisplayAlerts = False
     .Workbooks.Open ("C:\TEMP\Ask me question workflow.xlsm")
     .Run "'Ask me question workflow.xlsm'!AskMeFlow"
     If .activeworkbook.sheets(1).[a1].Value = "Complete" Then
         MsgBox "Code has run"
         .activeworkbook.sheets(1).[a1].Value = vbNullString
         .activeworkbook.Save
        .DisplayAlerts = True
         .activeworkbook.Close
         appExcel.Quit
        Set appExcel = Nothing
     End If
 End With
End Sub

탁월한 코드

Sub AskMeFloW()
'do stuff
ThisWorkbook.Sheets(1).[a1] = "Complete"
End Sub

정말 간단한 방법은 잠금 장치를 구현하는 것입니다.

이 코드는 미리 정의된 장소에서 파일이 있는지 확인하여 빠르고 더러운 해결책입니다.

인에C:\Ask me question workflow.xlsm이 하위 항목 추가:

Sub WrapAskMeFlow()
   Dim tmpFile As String
   tmpFile = "C:\AskMeFlow.tmp"
   Open tmpFile for Output as #1
   Close #1
   AskMeFlow
   Kill tmpFile
End Sub

아웃룩 매크로에서 다음을 추가합니다.

 Sub AskMeAlerts()
 Dim appExcel As Excel.Application 
 Dim wkb As Excel.Workbook 
 Set appExcel = CreateObject("Excel.Application") 
 appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
 appExcel.Visible = True 
 appExcel.Run "'Ask me question workflow.xlsm'!WrapAskMeFlow" 
 appExcel.DisplayAlerts = False 
 While Dir("C:\AskMeFlow.tmp")="":DoEvents:Wend
 While Dir("C:\AskMeFlow.tmp")<>"":DoEvents:Wend
 appExcel.ActiveWorkbook.Save 
 appExcel.Quit Set appExcel = Nothing 
 Set wkb = Nothing 
 End Sub

옵션1

특정한 경우에 가장 간단한 옵션은 저장 및 종료 명령을 Outlook 매크로가 아닌 Excel 매크로에 빌드하는 것입니다.

즉, Outlook 코드를 다음과 같이 수정할 수 있습니다.

 Sub AskMeAlerts()
 Dim appExcel As Excel.Application 
 Dim wkb As Excel.Workbook 'Is this declaration necessary for some code elsewhere? You do not use this variable and I would recommend removing the declaration.
      Set appExcel = CreateObject("Excel.Application")
      With appExcel 
           .Workbooks.Open ("C:\Ask me question workflow.xlsm") 
           .Visible = True 
           .Run "'Ask me question workflow.xlsm'!AskMeFlow" 
      'No need to explicitly set alert values or save workbook as Excel macro will handle this.
      End With 
      Set appExcel = Nothing 
      Set wkb = Nothing 'Again, is this necessary?
 End Sub

그런 다음 "질문 워크플로.xlsm" 파일 끝에 다음을 추가할 수 있습니다.

 Application.DisplayAlerts = False
 ThisWorkbook.Close SaveChanges:=True
 Application.Quit

참고: 수동으로 매크로를 실행하거나 워크북을 저장, 닫기 및 종료하지 않으려는 다른 사용 사례에서도 매크로를 실행할 경우 기본값은 False이지만 True by Outlook으로 설정된 입력 변수를 AskMeFlow 매크로에 추가하는 것을 고려할 수 있습니다.이것은 이 답변의 범위를 약간 벗어난 것 같아 더 자세히 설명하지는 않겠지만, 이 옵션에 관심이 있다면 알려주세요.

옵션2

수정했습니다.우리당의 해결책을 보세요. 제가 제안한 개선안이 그 해결책을 근본적으로 바꾸지는 않습니다.

옵션3

엑셀 코드의 특성에 따라 함수로 변환하여 출력 변수를 캡처할 수 있습니다.아래와 같은 것:

Sub AskMeAlerts()
 Dim appExcel As Excel.Application 
 Dim wkb As Excel.Workbook 
 Dim StrOutput as string
 StrOutput = "Excel macro did not complete."
 Set appExcel = CreateObject("Excel.Application") 
 appExcel.Workbooks.Open ("C:\Ask me question workflow.xlsm") 
 appExcel.Visible = True 
 StrOutput = appExcel.Run "'Ask me question workflow.xlsm'!AskMeFlow" 
 MsgBox StrOutput
 appExcel.DisplayAlerts = False 
 appExcel.ActiveWorkbook.Save 
 appExcel.Quit Set appExcel = Nothing 
 Set wkb = Nothing 
End Sub

그런 다음 AskMeFlow를 함수로 변경하고 다음 코드를 추가합니다.

Function AskMeFlow() as String
AskMeFlow = "Uncaught error executing Excel code."
'Your code here
AskMeFlow = "Excel code completed successfully!"
End Function

한다면Sub AskMeFlow사용자의 개입 없이 계산을 수행합니다. 간단히 엑셀의 것을 추적할 수 있다고 생각합니다.CalculationState.

Sub AskMeAlerts()
    With CreateObject("Excel.Application")
        .Workbooks.Open ("C:\Ask me question workflow.xlsm")
        .Visible = True

        ' Ensure Autocalculation is on
        .Calculation = -4105 ' xlCalculationAutomatic

        .DisplayAlerts = False
        .Run "'Ask me question workflow.xlsm'!AskMeFlow"

        ' Wait until calculation is done
        Do Until .CalculationState = 0   ' xlDone
            DoEvents
        Loop

        .ActiveWorkbook.Save
        .ActiveWorkbook.Close
        .Quit
    End With
End Sub

더 좋을 것 같습니다.AskMeFlow다음에서 자동 실행됩니다.Workbook_Open이벤트("본 워크북" 모듈 내).

Excel 매크로는 모든 워크북을 닫는 것으로 끝나야 하며 Outlook은 워크북이 열려 있는 동안 기다립니다.

Excel에서:

// do work
Application.ActiveWorkbook.Save
Application.DisplayAlerts = False
For Each wrkbk In Application.Workbooks
    If wrkbk.Name <> ThisWorkbook.Name Then wrkbk.Close
Next
ThisWorkbook.Save
ThisWorkbook.Close

Outlook 매크로는 워크북까지 풀링할 수 있습니다.카운트 = 0

While appExcel.Workbooks.Count > 0 :DoEvents:Wend
appExcel.DisplayAlerts = False 
appExcel.Quit 
Set appExcel = Nothing 

다음으로 코드를 종료합니다.

    On Error Resume Next
    On Error GoTo 0

ExitFunction:
    Set objShell = Nothing

End Function

언급URL : https://stackoverflow.com/questions/20188052/vba-outlook-calling-excel-macro-and-wait-till-macro-is-done