Excel 使用任务计划程序从PowerShell创建电子邮件(运行时错误429)

Excel 使用任务计划程序从PowerShell创建电子邮件(运行时错误429),excel,vba,outlook,automation,runtime-error,Excel,Vba,Outlook,Automation,Runtime Error,在执行某些分析后,我创建了几个脚本来发送电子邮件。这在以前是行之有效的。现在,一些脚本失败,并给出以下错误消息: 运行时错误“429”: ActiveX组件无法创建对象 然后,它引用Outlook对象行代码作为错误 Option Explicit Sub foo() Dim olApp As Object Set olApp = GetApplication("Outlook.Application") End Sub Sub foo2() Dim olApp As O

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

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

然后,它引用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
当我退出MS Outlook时,脚本会运行,如果Outlook正在运行,则会出错。我使用一个任务调度程序来运行它,Outlook通常会运行

Private Sub-Send\u Ratings\u Email()
Dim OutApp作为对象,OutMail作为对象
变暗rng As范围
像弦一样暗的链子
StrBody=“请在下面查找本周的到期日:”
Application.ScreenUpdating=False
出错时继续下一步
Set-OutApp=GetObject(,“Outlook.Application”)
错误转到0
如果OutApp为Nothing,则设置OutApp=GetObject(“Outlook.Application”)
关于错误转到清理
Set-OutMail=OutApp.CreateItem(0)
出错时继续下一步
调用AddAzureLabel(发邮件,“受限-内部”)
发邮件
.To=“example.com”
.Subject=“每周到期日-W/C”和格式(现在为“dd-mmm-yy”)
.HTMLBody=StrBody和RangetoHTML(rng)
.Display'或use.Send
以
错误转到0
发送邮件=无
清理:
设置应用程序=无
Application.ScreenUpdating=True

Powershell脚本在手动运行时可以工作。

如果outlook的运行不起作用,请检查它是否已经运行,并获取正在运行的应用程序,如果没有,请创建一个:

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

现在添加这个作为答案,但实际上只是尝试以一种不适合评论的方式进行调试。与另一个答案类似,但想法是使用它来创建一个测试用例,让我们看看是否可以让它在您的Task Scheduler>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
以及:

foo
过程中,
GetObject
引发一个错误,但它不是429错误,并且控制传递到成功实例化应用程序的
CreateObject
。因此,不幸的是,我无法在
foo
/
foo2
的任何组合下重现错误,展望是否已经打开似乎也无关紧要

这里有一个可能的解决方案 因此,这有点像黑客,因为我不认为它解决了根本原因(而且因为我无法复制您的错误,它实际上可能无法解决任何问题),但值得一试,正如您所指出的:

重要的是要注意,脚本在我退出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")

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

我会在获取obj后放置OEG0,以防创建obj也失败。如果outlook的运行不起作用,则您正在创建outlook实例。这实际上不是真的。即使Outlook已经在运行,您也可以
CreateObject
。在这种情况下,
CreateObject
返回已经运行的实例。将您的
Set-OutApp…
行替换为我答案上的块,这应该可以修复它。谢谢…收到一个错误,说它无法创建组件。突出显示“设置应用程序=创建”。。。。在IF语句中。还有其他想法吗?您是否在参考资料中检查了Microsoft Outlook XX.X对象库?您的outlook版本是XX.X。您的环境最近有变化吗?这可能是Outlook中不允许编程访问的安全设置。您可能需要在“文件>选项>信任中心>信任中心设置>编程访问”中进行切换。您好,大卫-谢谢您的帮助。这部分似乎还可以。我无法理解为什么从Task Scheduler中的Powershell脚本调用Excel宏时无法正常工作。关于可能通过Microsoft产生的错误源,这里有很多信息:我很想知道,当使用
GetObject
而不是
CreateObject
时,您是否会遇到相同的powershell/task scheduler错误。如果OutApp不存在,我会取出代码,然后设置OutApp=CreateObject(“Outlook.Application”)现在所发生的一切就是任务调度器执行分析并关闭,我通过-TS/PS运行了它,它打开了,没有弹出窗口出现。但是,当我从Powershell手动运行实例时works@dsound我修改了我的测试函数,试图在从PS运行时提供更多细节。@dsound如果Outlook已经在运行,您会尝试通过PowerShell使用
stop process
cmdlet杀死它吗?这是一种黑客行为,但它可能会起作用。啊,没用——黑客行为仍然会出现错误。它说outlook还没有运行,然后又出现了错误:(这太奇怪了,没有任何意义——所以现在,即使outlook没有运行(PS杀死进程)它仍然有错误?我希望我能重现你的错误,但我不能。它对我来说正是我认为它应该的方式。你这方面肯定存在某种配置、注册表或权限问题,但我不知道如何帮助找出根本原因:(
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")