#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. Конечно, спасибо. Я проверю это.