VBA не может создать Outlook при вызове из Powershell (ошибка выполнения 429) - PullRequest
1 голос
/ 18 марта 2019

Я создал несколько сценариев, которые помогут автоматически отправлять электронные письма после выполнения определенного анализа.Это работало ранее, однако по некоторым причинам некоторые из сценариев завершаются ошибкой и выдают следующее сообщение об ошибке:

ошибка времени выполнения '429': компонент ActiveX не может создать объект

Itзатем ссылается на строку кода объекта Outlook как на ошибку.

Важно отметить, что скрипт запускается при выходе из MS Outlook и выдает ошибки, если Outlook уже запущен.Я использую планировщик заданий, чтобы запустить это, и Outlook всегда будет работать.

Private Sub Send_Ratings_Email()


Dim OutApp As Object, OutMail As Object
Dim rng As Range
Dim StrBody As String
StrBody = "Please find  Maturities for the Current Week Below: "

Application.ScreenUpdating = False
On Error Resume Next
Set OutApp = GetObject(, "Outlook.Application")
On Error GoTo 0
If OutApp Is Nothing Then Set OutApp = GetObject("Outlook.Application")

On Error GoTo cleanup



  Set OutMail = OutApp.CreateItem(0)
        On Error Resume Next

        Call AddAzureLabel(OutMail, "Restricted - Internal")
        With OutMail
            .To = " example.com"
            .Subject = "Weekly Maturities - W/C " & Format(Now, "dd-mmm- 
         yy")
            .HTMLBody = StrBody & RangetoHTML(rng)


            .Display  'Or use .Send
        End With
        On Error GoTo 0
        Set OutMail = Nothing


        cleanup:
        Set OutApp = Nothing
        Application.ScreenUpdating = True

Сценарий Powershell работает, когда запускается вручную, а не в планировщике заданий.

Ответы [ 2 ]

1 голос
/ 18 марта 2019

Вы создаете экземпляр Outlook, если он не работает, вместо этого проверьте, запущено ли оно, и получите запущенное приложение или создайте его, если его нет:

On Error Resume Next
Set OutApp = GetObject(, "Outlook.Application")
On Error GoTo 0
If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application")
0 голосов
/ 18 марта 2019

Добавим это как ответ на данный момент, но на самом деле просто пытаемся отладить так, чтобы это не помещалось в комментариях.Аналогично другому ответу, но идея заключается в том, чтобы использовать его для создания тестового примера, и давайте посмотрим, сможем ли мы заставить его работать в вашем Планировщике заданий> Случай Powershell.

Пусть ваш PS запустит fooили foo2 процедуры здесь, и я инкапсулировал инстанцирование Outlook как отдельную функцию, чтобы попытаться сохранить вещи в чистоте и изолировать ошибку.

Option Explicit

Sub foo()
Dim olApp As Object
Set olApp = GetApplication("Outlook.Application")

End Sub

Sub foo2()
Dim olApp As Object
Set olApp = GetApplication2("Outlook.Application")
End Sub

Function GetApplication2(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = CreateObject(className)
If theApp Is Nothing Then
    MsgBox "Unable to get a handle on " & className
Else
    MsgBox "Successfully got a handle on " & className & ", returning to caller"
End If
Set GetApplication2 = theApp
End Function


Function GetApplication(className As String) As Object
' function to encapsulate the instantiation of an application object
Dim theApp As Object
On Error Resume Next
Set theApp = GetObject(, className)
If Err.Number <> 0 Then
    MsgBox "Unable to Get" & className & ", attempting to CreateObject"
    Set theApp = CreateObject(className)
End If

If theApp Is Nothing Then
    Err.Raise Err.Number, Err.Source, "Unable to Get or Create the " & className & "!"
    Set GetApplication = Nothing
End If

MsgBox "Successfully got a handle on Outlook Application, returning to caller"

Set GetApplication = theApp

End Function

Который я запускаю из PS как:

$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.Run("Module1.foo")

И:

$excel.Run("Module1.foo2")

В процедуре foo GetObject вызывает ошибку, но это не ошибка 429, и управление переходит к CreateObject, который успешно создает экземпляр приложения,Итак, к сожалению, я не могу воспроизвести ошибку при любой комбинации foo / foo2, и, кажется, уже не открыт ли Outlooks.

Вот какое-то хакерское потенциальное решение

Итак, это немного хакерски, потому что я не думаю, что это решает основную причину (и потому что я не могу повторить вашу ошибку, это может на самом деле ничего не решить) но стоит попробовать, как вы заметили:

Важно отметить, что скрипт запускается при выходе из MS Outlook и выдает ошибки, если Outlook уже запущен

Моя идея состоит в том, чтобы просто изменить свой PS для проверки работающего экземпляра Outlook и закрыть его с помощью stop-process Командлет.

try {
    stop-process -Name "outlook" -ErrorAction Stop
    Write-Host "Stopped the running instance of Outlook Application"
    } catch { 
    Write-Host "outlook was not already running"
    } 

$excel = new-object -comobject excel.application
$file = "C:\debug\ps-excel.xlsm"
$wb = $excel.workbooks.open($file)
$excel.run("Module1.foo")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...