【问题标题】:VBA code saving as in outlook folder path is throwing runtime error保存为 Outlook 文件夹路径的 VBA 代码引发运行时错误
【发布时间】:2020-06-18 15:19:36
【问题描述】:

每月自动将 Outlook 收件箱中的特定电子邮件保存在硬盘上。

我希望能够每月自动保存 Outlook 收件箱中包含关键字“批准”或“已批准”且不区分大小写且由特定发件人发送的特定电子邮件。

  1. 在为另存为提供的文件夹路径中出现错误
  2. 我还想调整代码以使其每个月都能正常工作(例如在每个月的收件箱中可用电子邮件的日期之后运行宏 - 比如每月的第三周)
  3. 我想调整代码以仅保存来自特定发件人、特定主题和特定内容的电子邮件
Option Explicit

Sub outlooksavefile()

    Dim o As Outlook.Application
    Set o = New Outlook.Application

    Dim ons As Outlook.Namespace
    Set ons = o.GetNamespace("mapi")

    Dim fol As Outlook.Folder
    Set fol = ons.GetDefaultFolder(olFolderInbox).Folders("Test")

    Dim omail As Outlook.MailItem
    Set omail = o.CreateItem(olMailItem)

    For Each omail In fol.Items
        omail.SaveAs "H:\2019" & omail.Subject & ".msg"
    Next omail

End Sub

【问题讨论】:

  • 欢迎来到 S.O.!一般来说,尽量不要在一个问题中问多个问题。 (第 2 点和第 3 点似乎是附加问题)此外,请提供您从错误中得到的具体信息,以及您为找出问题所在或可能意味着什么而进行的任何研究。 IE。什么是omail.Subect --- 它返回一个有效的字符串吗?

标签: excel vba outlook


【解决方案1】:

您有责任确保文件名不包含无效字符(例如“:”或“\”) - 您的代码按原样使用邮件主题。

【讨论】:

  • 是否允许使用“:”?电子邮件主题包含“RE:寻求您对 DQ 检查的批准”
  • 不,当然不是 - 它是一个驱动器分隔符(如“c:\”)
【解决方案2】:

您必须通过检查其Class 来确保在您的文件夹中找到的每个项目都是一封电子邮件。

关于错误:也许您不允许在那里写信,或者 - 更有可能 - 电子邮件主题中的某些字符在您的文件系统中是被禁止的。我添加了一些代码来替换禁用字符。

如果您循环访问每封电子邮件,则无需在之前生成CreateItem 的其他新电子邮件。

Option Explicit

Sub outlooksavefile()
    Dim o As Outlook.Application
    Set o = New Outlook.Application

    Dim ons As Outlook.NameSpace
    Set ons = o.GetNamespace("mapi")

    Dim fol As Outlook.Folder
    Set fol = ons.GetDefaultFolder(olFolderInbox).Folders("Test")

    Dim omail As Object
    For Each omail In fol.Items
        If omail.Class = olMail Then  ' olMail = 43
            Debug.Print omail.Sender
            Debug.Print omail.Subject
            Debug.Print omail.Sender
            Debug.Print Left(omail.Body, 20)
            omail.SaveAs Environ("USERPROFILE") & "\Documents\" & _
                AllowedChars(omail.Subject) & ".msg", olMSG ' olMSG = 3
        End If
    Next omail
End Sub

Private Function AllowedChars(ByRef s As String) As String
    Dim i As Long
    Dim myChar As String
    AllowedChars = s
    For i = 1 To Len(AllowedChars)
        myChar = Mid$(AllowedChars, i, 1)
        If myChar Like "[<>:""/\|?*]" Or Asc(myChar) < 32 Then
            Mid$(AllowedChars, i, 1) = "_"
        End If
    Next i
End Function

关于您的问题 2:请在运行后提出另一个问题。

关于问题 3:我添加了一些调试信息以查看发件人和其他电子邮件项目的存储方式。基于此,您可能会生成一些 If 条件。

【讨论】:

  • 我尝试按原样执行上述代码,但出现错误 - 运行时错误 13。类型不匹配。当我单击 Debug 时,它会导航到 Next omail 行。我用谷歌搜索了错误代码,它说明了以下内容。
  • 我的错:如果我将 omail 声明为 MailItem,那么之后检查它的类以确保它是一封电子邮件是没有用的 - 所以我将它的声明更改为 Object。它可以是您文件夹中的任何项目。
  • 我重新运行上述代码以将 omail 声明为对象。我没有收到任何错误。但是我怎样才能确保我保存了电子邮件。我在代码中提供的位置没有看到任何已保存的电子邮件。感谢您的帮助!
  • 我也尝试添加 If 条件,但我认为这是错误的,因为我没有看到文件夹位置上的文件?我想保存电子邮件,当发件人是列出的 4 个名称中的任何一个并且正文内容包含不区分大小写的“批准”时。感谢您的帮助!
  • 在过滤发件人之前,请确保已保存测试电子邮件。将一封主题为“这是一个测试”的测试电子邮件放入收件箱的“测试”子文件夹中。用F8一步步运行代码,看看是否保存。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-08
  • 2015-09-08
  • 1970-01-01
  • 2014-09-25
  • 1970-01-01
相关资源
最近更新 更多