Сохранить приложение Outlook в папку на ПК с помощью Excel VBA - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь сохранить вложения из подпапки в Outlook в папку на диске C с помощью Excel VBA.

Например, в папке «Входящие» у меня есть подпапка «Данные», и в этой папке находятся электронные письма с разными вложениями Excel с разными данными, но с тем же форматированием и тем же именем вложения, но с обновленной датой ( Например: «Имя приложения + 28 марта»).

Эти письма отправляются ежедневно. Я хочу, чтобы все вложения, еще не сохраненные, были сохранены в папке на диске C, а затем открыты для каждого вложения, чтобы извлечь соответствующие данные в Excel.

Я могу извлечь соответствующие данные, как только файлы будут на моем диске C, но я не могу указать путь от Excel к Outlook без Outlook VBA (что я не хочу делать).

Это то, что я имею до сих пор: (комментарии для моей пользы, потому что я новичок в этом)

Sub attachmentsave()

Dim olook As Outlook.Application
Dim omailitem As Outlook.mailitem
'whenever dealing with folders we need to define outlook.namespace This is a class that opens the gate for me to access all outlook folders
Dim onamespace As Outlook.Namespace

Dim fol As Outlook.Folder 'we need to tell vba where we have out emails with attachments stored
Dim atmt As Outlook.Attachment '.attachment is a class that will help us deal with emails that have attachments

Set olook = New Outlook.Application
Set omailitem = olook.CreateItem(olmailitem)

'messaging application protocol interface
Set onamespace = olook.GetNameSpace("MAPI")
Set fol = onamespace.GetDefaultFolder(olFolderInbox)

For Each omailitem In fol.items
    For Each atmt In omailitem.attachments

        atmt.SaveAsFile "C:/" & atmt.FileName
        'all attachments in inbox should be save in C drive

    Next

Next

End Sub

1 Ответ

0 голосов
/ 18 ноября 2018

Вам нужна книга Excel с поддержкой макросов со ссылкой на «Библиотеку объектов Microsoft Output nn.n», где «nn.n» зависит от версии Office, которую вы используете.Пожалуйста, не смешивайте версии;Я никогда не пробовал, но я понимаю, что это вызывает проблемы.

Я предполагаю, что вы знакомы с Excel VBA и знаете, как создать книгу с поддержкой макросов.Из ваших комментариев я предполагаю, что вы не знаете о ссылках.

Большая часть возможностей VBA не является родной, а исходит от библиотек, на которые вы можете ссылаться, если вам нужна их функциональность.Откройте редактор VBA и нажмите Инструменты, а затем Ссылки.Вы получите длинный список доступных ссылок.Те, наверху, будут отмечены галочкой.Например, будет отмечена отметка «Библиотека объектов Microsoft Excel nn.n».Без этой ссылки компилятор не знал бы, что такое диапазон или рабочий лист.Примечание. «Nn.n» зависит от используемой версии Office.Для меня это значение «16.0», потому что я использую Office 365.

Ссылки без отметки в алфавитном порядке.Прокрутите список вниз, пока не найдете «Библиотека объектов Microsoft Outlook nn.n».Нажмите на поле слева, чтобы отметить эту ссылку.Нажмите «ОК».Если вы нажмете Инструменты, а затем снова Ссылки, вы увидите галочку «Библиотека объектов Microsoft Outlook nn.n» в верхней части.Компилятор теперь имеет доступ к определениям MailItem, Folder и остальной части объектной модели Outlook.

Скопируйте приведенный ниже код в новый модуль:

Option Explicit
Sub ListStores()

  ' Needs reference to "Microsoft Output nn.n Object Library"
  ' where "nn.n" depends on the version of Outlook you are using.

  Dim AppOut As New Outlook.Application
  Dim InxStoreCrnt As Long
  Dim FldrInbox As Outlook.Folder

  With AppOut
    With .Session
      Debug.Print "List of stores:"
      For InxStoreCrnt = 1 To .Folders.Count
        Debug.Print "  " & .Folders(InxStoreCrnt).Name
      Next

      Set FldrInbox = .GetDefaultFolder(olFolderInbox)
      Debug.Print "Store for default Inbox: " & FldrInbox.Parent.Name

    End With
  End With

  AppOut.Quit
  Set AppOut = Nothing

End Sub

VBA обычно имеет более одного метода для достижения желаемого эффекта.Вы использовали «NameSpace» в своем коде, в то время как я использовал «Session».В документации говорится, что эти два метода эквивалентны.Если вы пишете свой собственный код, вы можете выбрать любой метод, который вы предпочитаете.Но если вы ищете полезные фрагменты, вы должны быть готовы к другим людям с другими предпочтениями.

Dim AppOut As New Outlook.Application создает экземпляр Outlook, который будет обращаться к файлам Outlook от имени макроса.

With AppOut
  With .Session
     :   :   :   :
  End With
End With

Я могу заменить : : : : на любой Outlook VBA.Если макрос Excel пытается получить доступ к электронной почте, пользователь будет предупрежден и попросит дать разрешение на запуск макроса.

Outlook хранит электронные письма, встречи, задачи и т. Д. В файлах, которые он вызывает Хранилища.Вы можете увидеть эти файлы PST, потому что большинство из них имеют расширение PST, но файл OST также является хранилищем.Вы можете увидеть их под названием «Учетные записи», потому что по умолчанию Outlook создает одно хранилище для каждой учетной записи электронной почты.Однако вы можете создать столько дополнительных магазинов, сколько захотите, ни один из которых не будет Аккаунтом.

Этот код создаст список магазинов, к которым вы можете получить доступ:

  Debug.Print "List of stores:"
  For InxStoreCrnt = 1 To .Folders.Count
    Debug.Print "  " & .Folders(InxStoreCrnt).Name
  Next

Вывод может выглядеть примерно так:

List of stores:
  Outlook Data File
  Smith John@ISPOne.com
  Archive Folders
  Backup
  John Smith@ISPTwo.com
  OutlookOutlook

Приведенное выше основано на моемдомашняя установка.Рабочая установка, скорее всего, будет несколько иной.Различия будут зависеть от параметров, выбранных во время установки.В рабочую установку также могут входить общие папки, которых у меня нет в моей системе.

Если вы посмотрите на панель папок, у вас будут имена с другими именами с отступом внизу.Имена будут магазинами и будут соответствовать магазинам, перечисленным макросом, хотя последовательность, вероятно, будет другой.Другие имена на панели папок будут папками в каждом магазине.

Последний бит моего макроса:

  Set FldrInbox = .GetDefaultFolder(olFolderInbox)
  Debug.Print "Store for default Inbox: " & FldrInbox.Parent.Name

У вас есть подобный код для доступа к папке «Входящие», но это может небудьте Входящие вы хотите.В моей системе этот код выводит:

Store for default Inbox: Outlook Data File

«Файл данных Outlook» - это хранилище Outlook по умолчанию.В моей системе календарь и мои задания хранятся в этом магазине, а мои электронные письма - нет.У меня есть две учетные записи электронной почты, и у каждого есть свой собственный магазин.

Попробуйте этот макрос выше.GetDefaultFolder находит папку "Входящие", к которой вам нужно получить доступ?

Теперь добавьте этот макрос:

Sub ListStoresAndFirstEmails()

  ' Needs reference to "Microsoft Output nn.n Object Library"
  ' where "nn.n" depends on the version of Outlook you are using.

  Dim AppOut As New Outlook.Application
  Dim InxFldrCrnt As Long
  Dim InxStoreCrnt As Long
  Dim FldrInbox As Outlook.Folder

  With AppOut
    With .Session
      Debug.Print "List of stores and first emails:"
      For InxStoreCrnt = 1 To .Folders.Count
        Debug.Print "  " & .Folders(InxStoreCrnt).Name
        For InxFldrCrnt = 1 To .Folders(InxStoreCrnt).Folders.Count
          If .Folders(InxStoreCrnt).Folders(InxFldrCrnt).Name = "Inbox" Then
            Set FldrInbox = .Folders(InxStoreCrnt).Folders(InxFldrCrnt)
            If FldrInbox.Items.Count > 0 Then
              With FldrInbox.Items(1)
                Debug.Print "    Subject: " & .Subject
                Debug.Print "    Received: " & .ReceivedTime
                Debug.Print "    From: " & .SenderEmailAddress
              End With
            End If
            Exit For
          End If
        Next
      Next
    End With
  End With

  AppOut.Quit
  Set AppOut = Nothing
End Sub

Этот макростакже о расследовании ваших магазинов. Макрос сканирует ваши магазины. Для каждого магазина он просматривает список папок уровня 1 в поисках «Входящие». Если он находит «Входящие», он предполагает, что самым старым элементом в нем является MailItem, и выводит его тему, полученное время и отправителя. Если самый старый элемент не является MailItem, вы получите сообщение об ошибке. Я почти надеюсь, что вы получите ошибку, чтобы продемонстрировать важность того, чтобы не делать предположений.

Наконец добавьте:

Sub ListAttachments()

  Dim AppOut As New Outlook.Application
  Dim InxAttachCrnt As Long
  Dim InxItemCrnt As Long
  Dim InxStoreCrnt As Long
  Dim FldrData As Outlook.Folder

  With AppOut
    With .Session
      Set FldrData = .Folders("Outlook Data File").Folders("Inbox").Folders("Data")
    End With
  End With

  Debug.Print "List emails with attachments within: ";
  Debug.Print " " & FldrData.Name & " of " & FldrData.Parent.Name & _
              " of " & FldrData.Parent.Parent.Name
  With FldrData
    For InxItemCrnt = 1 To FldrData.Items.Count
      If .Items(InxItemCrnt).Class = olMail Then
        With .Items(InxItemCrnt)
          If .Attachments.Count > 0 Then
            Debug.Print "    Subject: " & .Subject
            Debug.Print "    Received: " & .ReceivedTime
            Debug.Print "    From: " & .SenderEmailAddress
            For InxAttachCrnt = 1 To .Attachments.Count
              Debug.Print "      " & InxAttachCrnt & " " & .Attachments(InxAttachCrnt).DisplayName
            Next
          End If
        End With
      End If
    Next
  End With

  AppOut.Quit
  Set AppOut = Nothing

End Sub

Я всегда держу некоторые нежелательные письма в магазине «Файл данных Outlook» для тестирования.

В Set FldrData = .Folders("Outlook Data File").Folders("Inbox").Folders("Data") необходимо заменить «Файл данных Outlook» на название магазина, содержащего электронные письма, представляющие интерес. Если я правильно понимаю, электронные письма находятся в папке «Данные» в папке «Входящие». Если я неправильно понял, обратите внимание, как я использовал цепочку «Папки (xxxx)», чтобы добраться до нужной папки. В предыдущих письмах я использовал индексы для доступа к магазинам и папкам. Здесь я указал конкретную папку.

В этой папке я ищу MailItems (показывая, как избежать других элементов) и, если у них есть вложения, перечисляет некоторые свойства электронного письма и имена его вложений.

Это насколько я могу сделать, потому что я не до конца понимаю ваше объяснение того, как называются вложения или где вы хотите сохранить вложения.

...