【问题标题】:Create email from PowerShell using Task Scheduler (Runtime Error 429)使用任务计划程序从 PowerShell 创建电子邮件(运行时错误 429)
【发布时间】:2019-08-08 20:27:52
【问题描述】:

在执行某些分析后,我创建了几个脚本来发送电子邮件。这以前有效。现在一些脚本失败并给出以下错误消息:

运行时错误“429”:
ActiveX 组件无法创建对象

然后它将 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 脚本在手动运行时有效。

【问题讨论】:

  • 您的环境最近是否发生了变化?这可能是 Outlook 中不允许编程访问的安全设置。您可能需要在“文件”>“选项”>“信任中心”>“信任中心设置”>“程序访问”中进行切换。
  • 嗨大卫 - 感谢您的帮助。这部分似乎还可以。我不明白为什么从任务计划程序中的 Powershell 脚本调用 Excel 宏不起作用
  • 嗯。有很多关于微软可能的错误来源的信息,这里:support.microsoft.com/en-us/help/828550/…
  • 我很想知道您在使用 GetObject 而不是 CreateObject 时是否遇到相同的 powershell/任务调度程序错误。
  • 我已经取出了代码 If OutApp Is Nothing Then Set OutApp = CreateObject("Outlook.Application") 现在所发生的只是任务调度程序执行分析并关闭

标签: excel vba outlook automation runtime-error


【解决方案1】:

如果 Outlook 实例无法运行,则您正在创建它,而是检查它是否已在运行并获取正在运行的应用程序,如果没有,则创建一个:

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

【讨论】:

  • 我会在获取 obj 之后放置 OEG0,以防创建 obj 也失败。
  • 你正在创建一个 Outlook 实例,如果它无法运行的话这实际上不是真的。即使 Outlook 已经在运行,您也可以CreateObject。在这种情况下,CreateObject 返回已经运行的实例。
  • 用我的答案块替换你的Set OutApp... 行,应该可以解决它。
  • 谢谢...收到一个错误,说它无法创建组件。在 IF 语句中突出显示“Set OutApp = Create”....。还有其他想法吗?
  • 您的参考文献中是否检查了Microsoft Outlook XX.X Object Library?成为 XX.X 版本的 Outlook。
【解决方案2】:

在您的任务计划程序任务中取消勾选“以最高权限运行”

【讨论】:

    【解决方案3】:

    暂时将其添加为答案,但实际上只是尝试以不适合 cmets 的方式进行调试。与其他答案类似,但想法是使用它来创建一个测试用例,让我们看看我们是否可以让它在您的 Task Scheduler>Powershell 案例中工作。

    让您的 PS 在此处运行 foofoo2 过程,我已将 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 Cmdlet 将其关闭。

    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")
    

    【讨论】:

    • 我通过 - TS/PS 运行了它,它打开了,但无论哪种方式都没有出现任何弹出窗口。但是,当我从 Powershell 手动运行时,实例可以工作
    • @dsound 我修改了我的测试函数,以便在从 PS 运行时尝试提供更多细节。
    • @dsound 如果 Outlook 已经在运行,您会尝试使用stop-process cmdlet 通过 PowerShell 杀死它吗?有点像黑客,但它可能会起作用。
    • 啊没用 - 黑客仍然会出现错误。它说 Outlook 尚未运行,然后继续出现错误:(
    • 太古怪了,这没有任何意义——所以现在,即使 Outlook 没有运行(PS 终止进程)它仍然会出错?我希望我能重现你的错误,但我不能。它完全按照我认为应该的方式为我工作。您必须有某种配置、注册表或权限问题,但我不知道如何帮助找出根本原因:(
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2013-09-29
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    • 1970-01-01
    相关资源
    最近更新 更多