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
둘 중 하나라도
- Excel 매크로를 Outlook으로 포팅하고 직접 실행
- 플래그를 사용하여 코드 완료 캡처
아래 코드는 첫 번째 시트의 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
'programing' 카테고리의 다른 글
고투 사용을 피하고 중첩 루프를 효율적으로 끊는 방법 (0) | 2023.09.27 |
---|---|
동일한 테이블의 다른 여러 행과 관련된 테이블 업데이트 시도 (0) | 2023.09.27 |
Cannot find name 'console'. What could be the reason for this? (0) | 2023.09.27 |
What APIs are used to draw over other apps (like Facebook's Chat Heads)? (0) | 2023.09.27 |
Select2 또는 Choosed에 대해 적절히 테스트된 대안이 있습니까? (0) | 2023.09.17 |