访问宏以从 MS Outlook 读取电子邮件

Posted

技术标签:

【中文标题】访问宏以从 MS Outlook 读取电子邮件【英文标题】:Access macro to read emails from MS Outlook 【发布时间】:2013-01-28 19:17:04 【问题描述】:

我在 Access 中有一个宏,它连接到正在运行的 MS Outlook 实例。

宏一直在工作,直到上周我开始收到错误:Activex 组件无法创建对象每当我运行宏时。

这是一段代码以及它当前失败的地方:

Function GatherDailyStats()
Dim oOlAp As Object, oOlns As Object, oOlInb As Object
Dim oOlItm As Object
'Dim FileName As
Dim i, j As Integer
Dim strDir1 As String
Dim strDir2 As String
'~~> Get Outlook instance
Set oOlAp = GetObject(, "Outlook.Application") '--**THIS IS WHERE IT FAILS**
Set oOlns = oOlAp.GetNamespace("MAPI")
Set oOlInb = oOlns.GetDefaultFolder(olFolderInbox).Folders.Item("Daily Stats")

'~~> Check if there are any actual unread emails
If oOlInb.Items.Restrict("[UnRead] = True").Count = 0 Then
    MsgBox "NO Unread Email In Daily Stats folder"
    Exit Function
End If

自从我创建并彻底测试后,代码没有任何变化。


更新:我刚刚在另一台计算机上测试了相同的应用程序,它在那里运行良好。

【问题讨论】:

感谢您的回复,但我已经尝试过 Microsoft 的这些建议,但都没有解决问题。 我会考虑将该信息添加到问题中。谢谢! 【参考方案1】:

Here is a KB article about the ROT and how Office applications by design don't register until their start up sequence has finished.您可能会看到一个一直存在的问题,只是以前从未遇到过,无论出于何种原因。

从this discussion 提升,您可能想尝试添加一个后备以确保应用程序正在运行:

    On Error Resume Next
    Set objOutlook = GetObject(, "Outlook.Application")
    If Err.Number = 429 Then
        Set objOutlook = CreateObject("Outlook.Application") 
    End If

从同样的讨论中,重要的是要注意 Outlook 2010 显然在未以管理员模式启动时在 ROT 中注册存在某种问题。

Apparently there is a work around 某人已发布,其中包括:

...如果您将“所有人”组分配给 Office 安装的完全权限 然后它会工作的目录。

不确定这是最好的主意,但这是 Office 2010 的一个已知问题。

编辑:here is one last resource.

【讨论】:

感谢您的回复 Pow-Ian,但不幸的是,在尝试实施这些建议中的每一项后,我无法使其再次发挥作用。应用程序在 GetObject 或 CreateObject 处一直失败。 如果我使用 Excel.Application 而不是 Outlook.Application,GetObject 命令可以完美运行...这可能与权限/安全性有关吗?请记住,我已经实现了将所有人添加到 Office 安装文件夹的解决方法。 这当然是可能的。似乎没有人知道如何专门从 ROT 中获得前景。我见过他们建议寻找 2010 年的 Outlook.Application.14 等的地方,但这增加了开销,包括必须检查各个版本。 我也读到过,并且挖掘我能够找到与此错误相关的内容。我可以通过将 MS Outlook 的版本添加到命令 (Outlook.Application.14) 来使其运行,但 GetObject 仍然不起作用,所以我必须在 Outlook 关闭的情况下运行宏。【参考方案2】:

如果应用程序未运行,GetObject 将引发错误。你需要检查一下:

On Error Resume Next
Set oOlAp = GetObject(, "Outlook.Application")
If Err.Number <> 0 Then Set oOlAp = New Outlook.Application

或者,您可以只创建对象的新实例:

Set oOlAp = CreateObject("Outlook.Application")

使用CreateObject 创建一个新实例当然会在已经初始化相同类型的对象的情况下增加资源负载。换一种说法,为了提高性能并减少系统资源的使用,最好使用第一个建议的解决方案。

【讨论】:

谢谢,但无论 Outlook 是否正在运行,GetObject 和 CreateObject 都不起作用,并且都抛出完全相同的错误。【参考方案3】:

首先,在创建 Outlook.Application 对象的实例时始终使用 CreateObject - Outlook 是单例的,因此登录用户只会运行一个实例。 其次,Outlook 和 Access 的版本是什么?都是同一个版本吗>?如果不是,它们都是 32 位还是 64 位?

【讨论】:

嗨,德米特里。感谢您的回复,但我有点不同意。我可以向您证明,对于 MS Outlook 2010,可以同时运行多个实例。不管怎样,他们都是 2012 年,32 岁。 仅当它们在不同的用户上下文中运行或其中一个实例挂起而另一个实例正在等待挂起的实例恢复活动时。

以上是关于访问宏以从 MS Outlook 读取电子邮件的主要内容,如果未能解决你的问题,请参考以下文章

VBA 在 Outlook 中粘贴带有图表的特定 excel 范围

MS Access / Outlook 2010 - 如何选择从哪个帐户发送电子邮件?

html HTML电子邮件模板:MS Outlook的最大宽度黑客攻击

html HTML电子邮件模板:MS Outlook的最大宽度黑客攻击

Outlook 兑换 - 在阅读电子邮件时更改默认收件箱

将电子邮件从 MS Outlook 拖放到 Eclipse RCP