1

我在 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

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


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

4

3 回答 3

1

这是一篇关于 ROT 的知识库文章,以及 Office 应用程序设计如何在启动序列完成之前不注册。您可能会看到一个一直存在的问题,只是以前从未遇到过,无论出于何种原因。

这个讨论中解脱出来,您可能想尝试添加一个后备以确保应用程序正在运行:

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

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

显然,有人发布了一项解决方法,其中包括:

...如果您将 Everyone 组完全权限分配给 Office 安装目录,它将起作用。

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

编辑:这是最后一个资源

于 2013-01-28T20:01:54.327 回答
1

如果应用程序未运行,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创建新实例会增加资源负载。换一种说法,为了提高性能并降低系统资源的使用,最好使用第一个建议的解决方案。

于 2013-01-28T20:05:52.650 回答
0

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

于 2013-01-28T23:34:07.993 回答