从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉

Posted

技术标签:

【中文标题】从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉【英文标题】:Starting Outlook 2016 from MS Access 2016 VBA triggers "another program is using Outlook" and dies 【发布时间】:2018-02-11 21:04:40 【问题描述】:

我在 MS Access 2016 中使用以下代码来启动 Outlook 2016 的实例:

Dim appOutLook As Object

    On Error Resume Next
    Set appOutLook = GetObject(, "Outlook.Application")
    On Error GoTo 0

    If appOutLook Is Nothing Then
        Set appOutLook = CreateObject("Outlook.Application")
    End If

End Sub

当我运行上述代码时,Outlook 2016 已关闭。 但是,Outlook 不会打开。 我注意到,当我运行此代码时,我的任务栏上会显示一个图标,说明“另一个程序正在使用 Outlook”。 此图标显示约 2 秒钟,然后消失。 这可能意味着另一个服务正在后台运行。 我没有找到任何可能适用的服务。 我的 Outlook 帐户是 Google 帐户,没有发现任何可能在后台运行的 Google 相关服务。

坦率地说,我不确定这是否是一个编码问题,因为是否有更好的方法使用 VBA 来启动 Outlook 实例。 我没有这方面的线索。

【问题讨论】:

警告表明程序已启动 Outlook。 Outlook 不会自动显示。后续代码出现什么错误提示outlook没有打开? @niton,感谢您的回复。不会发生错误。一个图标出现大约 2 秒钟,说明“另一个程序正在使用 Outlook”,然后消失。我已经在后台搜索了导致此行为的任何服务。我认为这与代码无关,但您永远无法分辨。 【参考方案1】:

我可能会离开,但我认为您的代码有点混乱。我会先删除“on error”行,因为它们可能隐藏了您需要了解的错误。

'On Error Resume Next
Set appOutLook = GetObject(, "Outlook.Application")
'On Error GoTo 0

这里

If appOutLook Is Nothing Then...

你已经Set appOutlook,所以它永远不会是Nothing,并且该块不会运行。

我曾经这样做过。代码有点旧,但看起来像你的,所以我认为它应该可以工作。 (为了与其类型一致,我使用了 objOutlook,而不是 appOutlook。)

Dim objOutlook As Object

'See if Outlook is already open and use that.
Set objOutlook = GetObject(, "Outlook.Application")

'If Err, Outlook is not open; get a new instance.
If Err <> 0 Then
    'Create the Outlook session.
    Set objOutlook = CreateObject("Outlook.Application")
End If

Hth.


新代码:

Dim oOutlook As Outlook.Application
Set oOutlook = CreateObject("Outlook.Application")

Debug.Print oOutlook.Application.Name
Debug.Print oOutlook.Application.ProductCode
Debug.Print oOutlook.Application.Version

Set oOutlook = Nothing

链接:https://support.microsoft.com/en-ca/help/828550/you-receive-run-time-error-429-when-you-automate-office-applications

【讨论】:

我承认,我必须查一下On Error GoTo 0。我不记得它是如何工作的。我有一种感觉,你正在以不同的方式做我正在做的事情。 您的代码抛出 429 错误,ActiveX 组件无法在 GetObject 上创建对象。这是有道理的,因为没有运行 Outlook 的实例。为了绕过这个错误,我使用了 On Error Resume Next。我不认为这句话是正确的:“你已经设置了 appOutlook,所以它永远不会是 Nothing,块也不会运行”。如果没有运行 Outlook 实例,它将是 Nothing。无论如何,我试图理清一个朋友,但我会失败。一定是一些该死的微软服务在后台运行,我根本找不到任何线索。还是谢谢。 我们可能让它变得比必要的更难(旧代码/方法)。查看新代码和链接。至少我不再收到错误了(你提到的同样的错误,请注意)。希望您不会收到“另一个程序正在使用 Outlook”消息。 没有错误信息。仍然收到“另一个程序正在使用 Outlook”消息。我放弃了,感谢您尝试解决这个问题,非常感谢。 @wazz 这是 On Error Resume Next 的罕见情况之一,紧随其后的是 On Error GoTo 0 是正确的。当 Outlook 是否打开时,这是标准程序。这里 appOutLook 一开始总是什么都没有,因为它是 Outlook 关闭的给定条件。除非绕过,否则 GetObject 将给出错误。因为它被绕过了 appOutLook = Nothing。顺便说一句,使用 Outlook 的服务是 Access。【参考方案2】:

这对我有用。

Private Sub Email_Click()
Dim oOutlook As Object
Dim oFolder As Object
Dim oNameSpace As Object

On Error Resume Next
Set oOutlook = GetObject(, "Outlook.Application")

On Error GoTo 0
If oOutlook Is Nothing Then
    Shell ("OUTLOOK")
Else     'already open
MsgBox "Already Open"
End If
End Sub

【讨论】:

嗨,欢迎来到 ***!答案不应该是简单的 sn-ps 代码。你能详细说明一下这段代码为什么以及如何回答这个问题吗?

以上是关于从 MS Access 2016 VBA 启动 Outlook 2016 触发“另一个程序正在使用 Outlook”并死掉的主要内容,如果未能解决你的问题,请参考以下文章

MS Access 2003 - 创建 MDE 文件失败:错误 VBA 已损坏?

MS Access 2016 VBA 导致“输入参数值”窗口

从 MS Access VBA 通过 ODBC 进行 MySQL 查询:ADODB 异步执行不起作用

MS Access 2016 VBA 在组合查询条件中为空

如何使用 MS Access 2016 在 VBA 表达式中编写数字字段?

MS Access:使用 VBA 进行 SQL 插入的日期格式