Как извлечь данные электронной почты Outlook на основе темы письма с помощью VBA?

#vba

Вопрос:

У меня есть код VBA, который извлекает таблицы из электронных писем Outlook.

У меня есть подпапка в разделе «Входящие», в которую входят все похожие письма.

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

Код ниже.

 Option Explicit

Sub ImportTable()

Cells.Clear
Dim OLApp As Outlook.Application
'Set OA = CreateObject("Outlook.Application")
Set OLApp = New Outlook.Application

Dim ONS As Outlook.Namespace
Set ONS = OLApp.GetNamespace("MAPI")
Dim myFolder As Outlook.Folder
Set myFolder = ONS.Folders("emailaddress").Folders("Inbox")
Set myFolder = myFolder.Folders("Others")
Dim OLMAIL As Outlook.MailItem
Set OLMAIL = OLApp.CreateItem(olMailItem)

For Each OLMAIL In myFolder.Items
    Dim oHTML As MSHTML.HTMLDocument
    Set oHTML = New MSHTML.HTMLDocument
    Dim oElColl As MSHTML.IHTMLElementCollection
    With oHTML
        .Body.innerHTML = OLMAIL.HTMLBody
        Set oElColl = .getElementsByTagName("table")
    End With

    Dim t As Long, r As Long, c As Long
    Dim eRow As Long

    For t = 0 To oElColl.Length - 1
        eRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
        For r = 0 To (oElColl(t).Rows.Length - 1)
            For c = 0 To (oElColl(t).Rows(r).Cells.Length - 1)
                Range("A" amp; eRow).Offset(r, c).Value = oElColl(t).Rows(r).Cells(c).innerText
            Next c
        Next r
        eRow = Sheets(1).Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row
    Next t
        
    'Cells(eRow, 1) = "Sender's Name:" amp; " " amp; OLMAIL.Sender
    'Cells(eRow, 1).Interior.Color = vbRed
    'Cells(eRow, 1).Font.Color = vbWhite
    Cells(eRow, 1) = "Date amp; Time of Receipt:" amp; " " amp; OLMAIL.ReceivedTime
    Cells(eRow, 1).Interior.Color = vbRed
    Cells(eRow, 1).Font.Color = vbWhite
    Cells(eRow, 1).Columns.AutoFit
        
Next OLMAIL

Range("A1").Select

Set OLApp = Nothing
Set OLMAIL = Nothing
Set oHTML = Nothing
Set oElColl = Nothing

On Error Resume Next
Range("A1:A" amp; Worksheets(1).UsedRange.Rows.Count).SpecialCells(xlCellTypeBlanks).EntireRow.Delete

'ThisWorkbook.VBProject.VBE.MainWindow.Visible = False

End Sub
 

Комментарии:

1. Вы сказали I have a VBA script that extracts tables from outlook emails. Как обрабатываются эти письма? Они входят в папку «Входящие», и макрос запускается автоматически? Когда вы выбираете один или открываете его и запускаете макрос нажатием кнопки? Будьте более конкретны в том, как вы на самом деле работаете с письмами и как вы хотите это сделать.

2. На данный момент я вручную запускаю макрос всякий раз, когда хочу, чтобы данные были извлечены из электронных писем в файл Excel. Я ищу, как мне фильтровать электронные письма на основе «Темы» электронного письма, просматривать почту на основе определенной темы и извлекать данные только из этих электронных писем.

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

4. Конечно, я могу попробовать это. Спасибо! Но есть ли способ иметь только один макрос и фильтровать тему письма, а затем извлекать из него данные?

Ответ №1:

Если вы хотите иметь дело с входящими электронными письмами, посмотрите ссылку на веб-сайт, который я поместил в комментарии выше.

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

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

Вставьте код в модуль ThisOutlookSession

 Private WithEvents m_Inspectors As Outlook.Inspectors
Private WithEvents m_Inspector As Outlook.Inspector
  
Private Sub Application_Startup()
 Set m_Inspectors = Application.Inspectors
End Sub
  
Private Sub m_Inspectors_NewInspector(ByVal Inspector As Outlook.Inspector)
 If TypeOf Inspector.currentItem Is Outlook.MailItem Then
  'Handle emails only
  Set m_Inspector = Inspector
 End If
End Sub
  
Private Sub m_Inspector_Activate()
    Dim Item As MailItem
    
    If TypeOf m_Inspector.currentItem Is MailItem Then
        Set Item = m_Inspector.currentItem
        
        With Item
            ' Display mail
            '.Display
            
            ' Mails with filled opions
            Select Case .subject
                Case "mySubject_01"
                    Call Macro_01
                    
                Case "mySubject_02"
                    Call Macro_02
                    
                Case "mySubject_03"
                    Call Macro_03
            End Select
            
            Set Item = Nothing
        End With
    End If
End Sub
 

Комментарии:

1. Спасибо за код! Это будет выполняться каждый раз, когда я получаю электронное письмо с определенной темой?

2. Что, если я не хочу запускать код каждый раз, когда приходит электронное письмо? Допустим, у меня есть 10 электронных писем с темой «Volume data». Все эти электронные письма содержат информацию в виде таблиц, и я хочу извлечь эти данные из этих 10 электронных писем, чтобы можно было провести анализ. Итак, на данный момент код, который у меня есть, выполняет эту работу, но единственное, что он не зацикливается на строке темы писем. Как мне указать это условие в моем коде, которое я предоставил выше, что данные должны быть извлечены из электронных писем в моем почтовом ящике, тема которого указана как «Данные объема».?

3. Взгляните на эту ссылку . В нем показаны два примера, как Work with all items in any folder и Work with Selected items in any folder .

4. Конечно, спасибо. Я проверю это.