从 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 异步执行不起作用