使用 Access VBA 从 Outlook 获取附件

Posted

技术标签:

【中文标题】使用 Access VBA 从 Outlook 获取附件【英文标题】:Getting attachment from outlook using Access VBA 【发布时间】:2011-03-16 22:34:19 【问题描述】:

我在 Outlook 中创建了一个名为“报告”的文件夹。此文件夹包含在每封电子邮件中带有一个附件的电子邮件。我想使用 ACCESS VBA 将 Outlook 中“报告”文件夹中的附件保存到我计算机的本地驱动器中。这是我到目前为止的代码,但给了我错误。请帮忙:

Sub GetAttachments()

Dim ns As NameSpace
Dim Inbox As Outlook.MAPIFolder
Dim folder As Outlook.MAPIFolder

Dim Item As Object
Dim Atmt As Attachment
Dim FileName As String
Dim i As Integer


Set ns = GetNamespace("MAPI")

Set Inbox = ns.Folders.Item("Reports") // I get an error in this line says an object could not be found 


i = 0

If Inbox.Items.Count = 0 Then
   MsgBox "There are no messages in the Inbox.", vbInformation, _
        "Nothing Found"
   Exit Sub
End If


For Each Item In Inbox.Items
   For Each Atmt In Item.Attachments
     FileName = "C:\Automation\" & Atmt.FileName

     Atmt.SaveAsFile FileName   // here is another error says method is not found
     i = i + 1
   Next Atmt
Next Item

【问题讨论】:

【参考方案1】:

您的报告文件夹在收件箱文件夹中吗?您可能需要执行以下操作:

Set ns = GetNamespace("MAPI")
Set Inbox = ns.GetDefaultFolder(olFolderInbox)
Set RptFolder = Inbox.Folders("Reports") 

您保存附件的语法看起来是正确的(除了您的 cmets 对于 VBA 不正确)。您可以打印出您正在创建的文件名以查看它是否是有效名称。我假设您已经创建了您提到的自动化文件夹。

更新: 尝试将您的 Atmt 声明为 Outlook.Attachment。有一个 Access.Attachment 这样的东西,它没有 SaveAsFile 方法,它可能首先选择那个。如果您包含库名称,您应该会得到您需要的。

更新 2: 要访问您的 Reports 文件夹,一种方法是像您当前一样获取 Inbox 文件夹,然后获取其父文件夹,然后获取该文件夹下的 Reports 文件夹。

Set ns = GetNamespace("MAPI")
Set Inbox = ns.GetDefaultFolder(olFolderInbox)
Set Mailbox = Inbox.Parent
Set RptFolder = Mailbox.Folders("Reports") 

另一种方法是扫描“ns”下的项目以找到以“Mailbox”开头的项目,然后获取其下的 Reports 文件夹。这似乎比获取收件箱的父级要麻烦一些。这似乎也很麻烦,但我找不到直接进入邮箱文件夹的方法。

【讨论】:

您好托德,感谢您的回答。实际上,“报告”文件夹不在我的收件箱文件夹中。它直接在邮箱下面。 为了保存附件,当我写 atmt.列表中未显示属性“SaveAsFile”。我需要为此添加任何特定的参考吗?谢谢, 我明天研究一下,为你找到解决办法。您可以尝试做的一件事是列出 ns.Folders.Items 中的值以查看您实际使用的内容。至于附件 SaveAsFile,我假设您已经添加了 Outlook 参考以达到此目的。我会查看对象浏览器以验证它是否应该存在,并检查您是否获得了所需的正确附件对象类型。我在这台机器上没有 Office,否则我会更具体。您使用的是哪个版本的 Office? 好的,谢谢托德。我正在使用 MS Office 2007。附件是 pdf 文件。【参考方案2】:

替换

           For Each Item In Inbox.Items
             For Each Atmt In Item.Attachments
               FileName = "C:\Automation\" & Atmt.FileName

               Atmt.SaveAsFile FileName   // here is another error says method is not found
               i = i + 1
            Next Atmt

用.....

          For Each Item In Inbox.Items
            For Each Atmt In Item.Attachments
              FileName = "C:\Automation\" & Atmt.FileName

              Attachments.SaveAsFile FileName   // here is another error says method is not found
              i = i + 1
           Next Atmt

Outlook 在参考中没有 atmt 的问题,但是 MS Access 有。这应该可以解决您的问题。

戴维斯·罗杰斯

【讨论】:

【参考方案3】:

替换

Dim Atmt As Attachment

Dim Atmt As Outlook.Attachment

这将使 Access 为 atmt 找到正确的类。

【讨论】:

以上是关于使用 Access VBA 从 Outlook 获取附件的主要内容,如果未能解决你的问题,请参考以下文章

从 Access 中的 VBA 调用时 Outlook.exe 进程未结束

使用 VBA 保存和关闭办公程序(word、excel、access、outlook)以进行备份

使用 VBA 禁用 Outlook 安全设置

MS Outlook 干扰 Access vba 程序

从 Access 中打开 Outlook 的后期绑定

将 Access 和 Outlook 与 VBA 集成以进行定期报告