这让我感到疯狂,因为错误287 - 应用程序定义或对象定义错误。我正在开发一个从Outlook中拖放MailItem(我知道它是一个MailItem而不是任何其他类型)到Access备注字段中。试图在MailItem对象上调用SaveAs,它根本不起作用。我尝试了在阳光下的每一种方法 - 使用命名空间,不使用命名空间,使用.Item等。这是我当前的代码:
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")
Dim olMail As Outlook.MailItem
Set olMail = olNs.GetItemFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
olMail.SaveAs strPathAndFile, Outlook.OlSaveAsType.olMSG
Access 2010,Outlook 2010均为32位。 Win 7机器是64位。 谢谢!
编辑:在所有32位计算机上尝试,同样的错误。
编辑:尝试下面的德米特里的代码,同样的错误。
答案 0 :(得分:4)
确实没有必要重新打开消息:
Dim olApp As Outlook.Application
Dim olMail As Outlook.MailItem
Set olApp = CreateObject("Outlook.Application")
Set olMail = olApp.ActiveExplorer.Selection(1)
olMail.SaveAs strPathAndFile, Outlook.OlSaveAsType.olMSG
其次,strPathAndFile
变量的价值是什么?
作为测试,您可以安装Redemption并尝试以下脚本(您可以从OutlookSpy运行它 - 单击脚本,按钮,粘贴脚本,单击运行)。如果MAPI级别出现问题,Redemption将报告该问题,而不是提供模糊的错误消息。
set Session = CreateObject("Redemption.RDOSession")
Session.MAPIOBJECT = Application.Session.MAPIOBJECT
set Msg = Session.GetMessageFromID(Application.ActiveExplorer.Selection(1).EntryID)
Msg.SaveAs "c:\temp\test.msg", olMsg
答案 1 :(得分:2)
最后使用Dmitry Streblechenko令人敬畏的Redemption库完成了这项工作。谢谢!
Dim olApp As Outlook.Application
Set olApp = CreateObject("Outlook.Application")
Dim olNs As Outlook.NameSpace
Set olNs = olApp.GetNamespace("MAPI")
Dim oRDOSession As Redemption.RDOSession
Set oRDOSession = CreateObject("Redemption.RDOSession")
oRDOSession.MAPIOBJECT = olNs.Application.Session.MAPIOBJECT
If Not oRDOSession.LoggedOn Then oRDOSession.Logon
Dim oMsgItem As Redemption.RDOMail
Set oMsgItem = oRDOSession.GetMessageFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
strPathAndFile = "some\path\" & UniqueValueStr(Now()) & ".msg"
oMsgItem.SaveAs strPathAndFile
答案 2 :(得分:2)
为什么需要使用赎回?
我认为使用OOM和Redempton之间没有任何区别。
为什么需要在代码中使用GetItemFromID方法?
olNs.GetItemFromID(olNs.Application.ActiveExplorer.Selection(1).EntryID)
您已在资源管理器窗口中获得对所选对象的引用:
olNs.Application.ActiveExplorer.Selection(1)
此外,我建议打破调用的chaing并在单独的行上声明每个属性或方法调用。