我在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
自从我创建并彻底测试后,代码中没有任何变化。
更新:我刚刚在另一台计算机上测试了相同的应用程序,它在那里工作得很好。
答案 0 :(得分: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包括:
...如果为Everyone组分配Office安装的完整权限 目录它将工作。
不确定这是最好的想法,但它是Office 2010的已知问题。
答案 1 :(得分: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
创建新实例将增加资源负载。换句话说,为了提高性能和降低系统资源的使用,最好使用第一个建议的解决方案。
答案 2 :(得分:0)
首先,在创建Outlook.Application对象的实例时始终使用CreateObject - Outlook是一个单例,因此只有一个实例将为登录用户运行。
其次,Outlook和Access的版本是什么?它们都是相同的版本&gt;?如果没有,它们都是32位还是64位?