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