Есть какая то возможность выгрузить из Оутлука данные по письмам в эксель? Допустим дату отправки, адресат, тема письма. Так же по входящим сделать? Иногда очень надо узнать, что и сколько на работал..
Есть какая то возможность выгрузить из Оутлука данные по письмам в эксель? Допустим дату отправки, адресат, тема письма. Так же по входящим сделать? Иногда очень надо узнать, что и сколько на работал..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Вот здесь: http://www.excelworld.ru/forum/19-15042-126979-16-1420852811 есть моя "рыба" по доступу к папкам Исходящие и Входящие и по перебору писем в них. Также там выделяются адресаты писем, причем в общем случае по несколько человек на одно письмо. Тривиальные одиночные свойства писем типа даты отправки и темы найдёте в справке по объектной модели Outlook. В общем, рекомендую взять материал за основу.
Вот здесь: http://www.excelworld.ru/forum/19-15042-126979-16-1420852811 есть моя "рыба" по доступу к папкам Исходящие и Входящие и по перебору писем в них. Также там выделяются адресаты писем, причем в общем случае по несколько человек на одно письмо. Тривиальные одиночные свойства писем типа даты отправки и темы найдёте в справке по объектной модели Outlook. В общем, рекомендую взять материал за основу.Gustav
'В Tools\References включить ссылку на Microsoft Outlook 15.0 Object Library 'если нет 15.0, то на ту которая есть
Dim colLetters As Collection Dim objLetter As Letter 'создать модуль класса Letter! Dim FolderPath As String
Sub main() 'запускаем эту процедуру
Dim olApp As Outlook.Application Dim fldr As Outlook.Folder Dim arr(), i
Set colLetters = New Collection
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Входящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail Call processFolder(fldr)
'вывод в новую книгу Excel ReDim arr(1 To colLetters.Count, 1 To 8) For i = 1 To colLetters.Count arr(i, 1) = colLetters(i).FolderPath arr(i, 2) = colLetters(i).ReceivedTime arr(i, 3) = colLetters(i).Sender arr(i, 4) = colLetters(i).Subject arr(i, 5) = colLetters(i).To_ arr(i, 6) = colLetters(i).CC arr(i, 7) = colLetters(i).BCC arr(i, 8) = colLetters(i).NamesAddress Next i
With Application.Workbooks.Add.Worksheets(1) .Range("A1:H1") = Array("Папка", "Дата/время", "Отправитель", "Тема", "Кому", "Копия", "Скрытая копия", "Адреса участников") .Range("A1:H1").Font.Bold = True .Range("A1:H1").EntireColumn.ColumnWidth = 30 .Range("A2").Resize(colLetters.Count, 8) = arr End With
End Sub
Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder) Dim fldr As Outlook.Folder Dim item As Object Dim mail As Outlook.MailItem Dim rcpnt As Outlook.Recipient Dim i Dim folderPathPrev As String Dim recpntAddr As String
'перебор элементов в папке For Each item In pFolder.Items If item.Class = 43 Then 'обрабатываем только письма, 43 = olMail Set mail = item i = i + 1 recpntAddr = "" 'If i > 10 Then Exit For Debug.Print "Письмо " & i & " в папке " & pFolder.Name Set objLetter = New Letter
On Error Resume Next With objLetter .FolderPath = FolderPath .ReceivedTime = mail.ReceivedTime .Sender = mail.Sender .Subject = mail.Subject .To_ = mail.To .CC = mail.CC .BCC = mail.BCC End With
recpntAddr = recpntAddr & "; " & mail.Sender & " -- " & getAddress(mail.Sender, mail.Sender.Address) For Each rcpnt In mail.Recipients 'цикл по получателям recpntAddr = recpntAddr & "; " & rcpnt.Name & " -- " & getAddress(rcpnt.AddressEntry, rcpnt.Address) Next rcpnt recpntAddr = Mid(recpntAddr, 3) objLetter.NamesAddress = recpntAddr On Error GoTo 0
colLetters.Add objLetter
Set mail = Nothing End If Next item
'перебор папок (первого уровня вложенности) For Each fldr In pFolder.Folders Call processFolder(fldr) 'рекурсия Next fldr
FolderPath = folderPathPrev End Sub
Function getAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) Dim pa As PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr On Error GoTo 0 getAddress = addr End Function
[/vba]
Процедура main выводит в таблицу Excel информацию о письмах, находящихся в папках "Входящие" (Inbox) и "Исходящие" (Sent Items), а также из всех вложенных в них папок (рекурсивно). Состав информации (названия колонок): "Папка", "Дата/время", "Отправитель", "Тема", "Кому", "Копия", "Скрытая копия", "Адреса участников". Наиболее заморочные (и от того интересные) - первая и последняя колонки.
ВАЖНО! Помимо вышеуказанного модуля в рабочей книге нужно будет создать модуль класса под названием "Letter" со следующим содержимым: [vba]
Код
Option Explicit
Public FolderPath As String Public ReceivedTime As Date Public Sender As String Public Subject As String Public To_ As String Public CC As String Public BCC As String Public NamesAddress As String
[/vba]
ovechkin1973, держите модуль: [vba]
Код
Option Explicit
'В Tools\References включить ссылку на Microsoft Outlook 15.0 Object Library 'если нет 15.0, то на ту которая есть
Dim colLetters As Collection Dim objLetter As Letter 'создать модуль класса Letter! Dim FolderPath As String
Sub main() 'запускаем эту процедуру
Dim olApp As Outlook.Application Dim fldr As Outlook.Folder Dim arr(), i
Set colLetters = New Collection
Set olApp = CreateObject("Outlook.Application")
'обрабатываем папку Входящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(6) '6 = olFolderInbox Call processFolder(fldr)
'обрабатываем папку Исходящие и вложенные в нее Set fldr = olApp.Session.GetDefaultFolder(5) '5 = olFolderSentMail Call processFolder(fldr)
'вывод в новую книгу Excel ReDim arr(1 To colLetters.Count, 1 To 8) For i = 1 To colLetters.Count arr(i, 1) = colLetters(i).FolderPath arr(i, 2) = colLetters(i).ReceivedTime arr(i, 3) = colLetters(i).Sender arr(i, 4) = colLetters(i).Subject arr(i, 5) = colLetters(i).To_ arr(i, 6) = colLetters(i).CC arr(i, 7) = colLetters(i).BCC arr(i, 8) = colLetters(i).NamesAddress Next i
With Application.Workbooks.Add.Worksheets(1) .Range("A1:H1") = Array("Папка", "Дата/время", "Отправитель", "Тема", "Кому", "Копия", "Скрытая копия", "Адреса участников") .Range("A1:H1").Font.Bold = True .Range("A1:H1").EntireColumn.ColumnWidth = 30 .Range("A2").Resize(colLetters.Count, 8) = arr End With
End Sub
Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder) Dim fldr As Outlook.Folder Dim item As Object Dim mail As Outlook.MailItem Dim rcpnt As Outlook.Recipient Dim i Dim folderPathPrev As String Dim recpntAddr As String
'перебор элементов в папке For Each item In pFolder.Items If item.Class = 43 Then 'обрабатываем только письма, 43 = olMail Set mail = item i = i + 1 recpntAddr = "" 'If i > 10 Then Exit For Debug.Print "Письмо " & i & " в папке " & pFolder.Name Set objLetter = New Letter
On Error Resume Next With objLetter .FolderPath = FolderPath .ReceivedTime = mail.ReceivedTime .Sender = mail.Sender .Subject = mail.Subject .To_ = mail.To .CC = mail.CC .BCC = mail.BCC End With
recpntAddr = recpntAddr & "; " & mail.Sender & " -- " & getAddress(mail.Sender, mail.Sender.Address) For Each rcpnt In mail.Recipients 'цикл по получателям recpntAddr = recpntAddr & "; " & rcpnt.Name & " -- " & getAddress(rcpnt.AddressEntry, rcpnt.Address) Next rcpnt recpntAddr = Mid(recpntAddr, 3) objLetter.NamesAddress = recpntAddr On Error GoTo 0
colLetters.Add objLetter
Set mail = Nothing End If Next item
'перебор папок (первого уровня вложенности) For Each fldr In pFolder.Folders Call processFolder(fldr) 'рекурсия Next fldr
FolderPath = folderPathPrev End Sub
Function getAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) Dim pa As PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr On Error GoTo 0 getAddress = addr End Function
[/vba]
Процедура main выводит в таблицу Excel информацию о письмах, находящихся в папках "Входящие" (Inbox) и "Исходящие" (Sent Items), а также из всех вложенных в них папок (рекурсивно). Состав информации (названия колонок): "Папка", "Дата/время", "Отправитель", "Тема", "Кому", "Копия", "Скрытая копия", "Адреса участников". Наиболее заморочные (и от того интересные) - первая и последняя колонки.
ВАЖНО! Помимо вышеуказанного модуля в рабочей книге нужно будет создать модуль класса под названием "Letter" со следующим содержимым: [vba]
Код
Option Explicit
Public FolderPath As String Public ReceivedTime As Date Public Sender As String Public Subject As String Public To_ As String Public CC As String Public BCC As String Public NamesAddress As String
Gustav, выдает ошибку "модуль не является допустимым типом" Создал два модуля - в первом код разместил, что в первым приложили и сделал отдельный модуль Letter и в него разместил то, что во второй части у вас..
Gustav, выдает ошибку "модуль не является допустимым типом" Создал два модуля - в первом код разместил, что в первым приложили и сделал отдельный модуль Letter и в него разместил то, что во второй части у вас..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Мда.. абсолютно не внимателен и ни разу таким пользоваться не приходилось. После исправление ошибка "определяемый пользователем тип не определен" на строке кода
Код
Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder)
Мда.. абсолютно не внимателен и ни разу таким пользоваться не приходилось. После исправление ошибка "определяемый пользователем тип не определен" на строке кода
Код
Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder)
Если коллекцию пользовательских объектов ни разу не создавали, то и не приходилось поэтому. Но всё же когда-нибудь происходит в первый раз - вот и случай познакомиться!
Если коллекцию пользовательских объектов ни разу не создавали, то и не приходилось поэтому. Но всё же когда-нибудь происходит в первый раз - вот и случай познакомиться!Gustav
поставил галку на Microsoft Outlook 14.0 Object Library
Ну, в приложенном-то файле ее нет! Может только галку поставили, но ОК не нажали? Или наоборот - у меня иногда так бывало - выделяешь строку и жмёшь OK, забыв поставить галку.
Ладно. Если это для Вас так сложно, то можно не париться с галкой, но тогда надо в коде заменить явные типы объектов Outlook на безликие Object: [vba]
Код
Sub main() 'запускаем эту процедуру
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
..........
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder) Dim fldr As Object 'Outlook.Folder Dim item As Object Dim mail As Object 'Outlook.MailItem Dim rcpnt As Object 'Outlook.Recipient
[/vba] После такой замены при редактировании кода потеряется возможность пользоваться списком свойств и методов, появляющимся при наборе точки после имени объекта (а это несомненно удобно!). Но если Вы не собираетесь модифицировать мой код, то, наверное, и фиг с ним...
поставил галку на Microsoft Outlook 14.0 Object Library
Ну, в приложенном-то файле ее нет! Может только галку поставили, но ОК не нажали? Или наоборот - у меня иногда так бывало - выделяешь строку и жмёшь OK, забыв поставить галку.
Ладно. Если это для Вас так сложно, то можно не париться с галкой, но тогда надо в коде заменить явные типы объектов Outlook на безликие Object: [vba]
Код
Sub main() 'запускаем эту процедуру
Dim olApp As Object 'Outlook.Application Dim fldr As Object 'Outlook.Folder
..........
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder) Dim fldr As Object 'Outlook.Folder Dim item As Object Dim mail As Object 'Outlook.MailItem Dim rcpnt As Object 'Outlook.Recipient
[/vba] После такой замены при редактировании кода потеряется возможность пользоваться списком свойств и методов, появляющимся при наборе точки после имени объекта (а это несомненно удобно!). Но если Вы не собираетесь модифицировать мой код, то, наверное, и фиг с ним...Gustav
Странно, я открываю то, что выложил на форум и галка в нужном месте стоит Код заменил, но так же ошибка в том же месте, что в сообщении №7 описывал..ovechkin1973
Дык, а кто же внесёт исправление в это место-то, как было велено выше? [vba]
Код
[s]Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder)[/s]
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder)
[/vba] Хм... может, я не вижу галку от того, что версии разные... хотя в этом случае у галки, которая не может включиться на другом компьютере, обычно появляется слово MISSING, которого я также не вижу...
Коллеги, у кого еще Офис 2010! Видите ли вы в ссылках VBA галку на библиотеку Outlook 14.0 в файле сообщения №9 ?
Дык, а кто же внесёт исправление в это место-то, как было велено выше? [vba]
Код
[s]Sub processFolder(ByVal pFolder As Outlook.Folder) 'Outlook.Folder)[/s]
Sub processFolder(ByVal pFolder As Object) 'Outlook.Folder)
[/vba] Хм... может, я не вижу галку от того, что версии разные... хотя в этом случае у галки, которая не может включиться на другом компьютере, обычно появляется слово MISSING, которого я также не вижу...
Коллеги, у кого еще Офис 2010! Видите ли вы в ссылках VBA галку на библиотеку Outlook 14.0 в файле сообщения №9 ?Gustav
Gustav, пардон.. исправил. Сейчас та же ошибка, но в этой части кода
[vba]
Код
Function getAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) Dim pa As PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr On Error GoTo 0 getAddress = addr End Function
[/vba]
Gustav, пардон.. исправил. Сейчас та же ошибка, но в этой части кода
[vba]
Код
Function getAddress(ByVal pAddressEntry As Object, _ ByVal altaddr As String) Dim pa As PropertyAccessor Dim addr As String Set pa = pAddressEntry.PropertyAccessor On Error Resume Next addr = pa.GetProperty("http://schemas.microsoft.com/mapi/proptag/0x39FE001E") If addr = "" Then addr = altaddr On Error GoTo 0 getAddress = addr End Function
Уважаемый Gustav, процесс сдвинулся, код у меня заработал. Проверить полностью смогу только на работе.. дома Оутлуком почти не пользуюсь.. Всех с наступающим Новым Годом! Здоровья и новых знаний...
Уважаемый Gustav, процесс сдвинулся, код у меня заработал. Проверить полностью смогу только на работе.. дома Оутлуком почти не пользуюсь.. Всех с наступающим Новым Годом! Здоровья и новых знаний...ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Проверил на работе. Работает код.. но за письма за полтора года час точно файл обрабатывал, если даже не два.. видимо нужно диапазон дат для выгрузки задавать..
Проверил на работе. Работает код.. но за письма за полтора года час точно файл обрабатывал, если даже не два.. видимо нужно диапазон дат для выгрузки задавать..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Да, пожалуй, эта возможность напрашивалась... Воплотил - см. прилагаемый файл (сюда не поместилось).
Уважаемый Gustav, извиняюсь, что не отвечаю сразу. Не успел проверить. Точнее с наскока не получилось, пока пытаюсь разобраться, что не так сделал (по аналогии с первым разом)
Да, пожалуй, эта возможность напрашивалась... Воплотил - см. прилагаемый файл (сюда не поместилось).
Уважаемый Gustav, извиняюсь, что не отвечаю сразу. Не успел проверить. Точнее с наскока не получилось, пока пытаюсь разобраться, что не так сделал (по аналогии с первым разом)ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.