Сохранение кода VBA, как в пути к папке outlook, вызывает ошибку времени выполнения - PullRequest
0 голосов
/ 05 мая 2019

Автоматическое сохранение определенных писем из почтового ящика 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 голосов
/ 05 мая 2019

Вы несете ответственность за то, чтобы имя файла не содержало недопустимых символов (например, ":" или "\") - ваш код использует тему сообщения как есть.

0 голосов
/ 05 мая 2019

Вы должны убедиться, что каждый найденный элемент в вашей папке является электронным письмом, проверив его 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-условия.

...