在Outlook文件夹路径中另存为VBA代码会引发运行时错误

时间:2019-05-04 21:41:54

标签: excel vba outlook-vba

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

我希望每个月都可以自动保存来自Outlook收件箱的特定电子邮件,这些电子邮件的关键字为“批准”或“已批准”,并且不区分大小写并由特定发件人发送。

  1. 在为另存为提供的文件夹路径中出现错误
  2. 我还希望调整代码以使其每个月都能正常工作(例如,在每个月收件箱中都有电子邮件可用的日期之后运行宏,例如说每月的第3周)
  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

2 个答案:

答案 0 :(得分:0)

通过检查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条件。

答案 1 :(得分:0)

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