【问题标题】:Extract Outlook Emails from Subfolder (Shared Inbox) to Excel将 Outlook 电子邮件从子文件夹(共享收件箱)提取到 Excel
【发布时间】:2022-08-20 11:14:40
【问题描述】:

我有直接从共享文件夹的收件箱中提取的代码。

我需要它从子文件夹中提取。
例如:
共享文件夹 X
-收件箱
--子文件夹

另外,我想只提取每封电子邮件的前两行,而不是拖入整个电子邮件链。

以下代码从共享收件箱中提取。

Sub GetEmails()

\'Add Tools->References->\"Microsoft Outlook nn.n Object Library\"
\'nn.n varies as per our Outlook Installation
Dim OutlookApp As Outlook.Application
Dim OutlookNamespace As Variant
Dim i As Integer
Dim Folder As Outlook.MAPIFolder
Dim sFolders As Outlook.MAPIFolder
Dim iRow As Integer, oRow As Integer
Dim strMailboxName As String
Dim Pst_Folder_Name As String
strMailboxName = \"Shared Email Box\"

\'Mailbox or PST Main Folder Name (As how it is displayed in your Outlook Session)
strMailboxName = \"Shared Email Box\"

\'Mailbox Folder or PST Folder Name (As how it is displayed in your Outlook Session)
Pst_Folder_Name = \"Inbox\" \'Sample \"Inbox\" or \"Sent Items\"

\'To directly a Folder at a high level
\'Set Folder = Outlook.Session.Folders(MailBoxName).Folders(Pst_Folder_Name)

\'To access a main folder or a subfolder (level-1)
For Each Folder In Outlook.Session.Folders(strMailboxName).Folders
    If VBA.UCase(Folder.Name) = VBA.UCase(Pst_Folder_Name) Then GoTo Label_Folder_Found
    For Each sFolders In Folder.Folders
        If VBA.UCase(sFolders.Name) = VBA.UCase(Pst_Folder_Name) Then
            Set Folder = sFolders
            GoTo Label_Folder_Found
        End If
    Next sFolders
Next Folder

Label_Folder_Found:
    If Folder.Name = \"\" Then
        MsgBox \"Invalid Data in Input\"
        GoTo End_Lbl1:
    End If

    \'Read Through each Mail and export the details to Excel for Email Archival
    ThisWorkbook.Sheets(1).Activate
    Folder.Items.Sort \"Received\"

    \'Insert Column Headers
    ThisWorkbook.Sheets(1).Cells(1, 1) = \"Sender\"
    ThisWorkbook.Sheets(1).Cells(1, 2) = \"Subject\"
    ThisWorkbook.Sheets(1).Cells(1, 3) = \"Date\"
    ThisWorkbook.Sheets(1).Cells(1, 4) = \"Body\"

    \'Export eMail Data from PST Folder to Excel with date and time
    oRow = 1
    For iRow = 1 To Folder.Items.Count
        \'If condition to import mails received in last 18 days
        \'To import all emails, comment or remove this IF condition
        If VBA.DateValue(VBA.Now) - VBA.DateValue(Folder.Items.Item(iRow).ReceivedTime) <= 18 Then
            oRow = oRow + 1
            ThisWorkbook.Sheets(1).Cells(oRow, 1).Select
            ThisWorkbook.Sheets(1).Cells(oRow, 1) = Folder.Items.Item(iRow).SenderName
            ThisWorkbook.Sheets(1).Cells(oRow, 2) = Folder.Items.Item(iRow).Subject
            ThisWorkbook.Sheets(1).Cells(oRow, 3) = Folder.Items.Item(iRow).ReceivedTime
            ThisWorkbook.Sheets(1).Cells(oRow, 4) = Folder.Items.Item(iRow).Body
        End If
    Next iRow

    MsgBox \"Outlook Mails Extracted to Excel\"
    Set Folder = Nothing
    Set sFolders = Nothing

End_Lbl1:
End Sub
  • 对于前两行,您可以在 vbCrLf(或者可能在 vbLF)上拆分 Body 并获取结果数组的前两个元素。或者使用Left() 获取前(例如)200 个字符
  • 对不起,我对 vba 很陌生。我不知道你刚才说了什么。你能帮我写出来吗?

标签: vba outlook


【解决方案1】:

尝试这个:

Sub GetEmails()

    'Add Tools->References->"Microsoft Outlook nn.n Object Library"
    'nn.n varies as per our Outlook Installation
    Const NUM_DAYS As Long = 18
    Dim OutlookApp As Outlook.Application
    Dim i As Long
    Dim Folder As Outlook.MAPIFolder
    Dim itm As Object
    Dim iRow As Long, oRow As Long, ws As Worksheet, sBody As String
    Dim mailboxName As String, inboxName As String, subfolderName As String
    
    mailboxName = "mailboxNameHere"
    inboxName = "Inbox"
    subfolderName = "Contracts" 'for example

    Set OutlookApp = New Outlook.Application
    On Error Resume Next
    Set Folder = OutlookApp.Session.Folders(mailboxName) _
                     .Folders(inboxName).Folders(subfolderName)
    On Error GoTo 0
    
    If Folder Is Nothing Then
        MsgBox "Source folder not found!", vbExclamation, _
                "Problem with export"
        Exit Sub
    End If
    
    Set ws = ThisWorkbook.Worksheets(1)
    'add headers
    ws.Range("A1").Resize(1, 4).Value = Array("Sender", "Subject", "Date", "Body")
    iRow = 2
    Folder.Items.Sort "Received"
    For Each itm In Folder.Items
        If TypeOf itm Is Outlook.MailItem Then       'check it's a mail item (not appointment, etc)
            If Date - itm.ReceivedTime <= NUM_DAYS Then
                sBody = Left(Trim(itm.Body), 150)    'first 150 chars of Body
                sBody = Replace(sBody, vbCrLf, "; ") 'remove newlines
                sBody = Replace(sBody, vbLf, "; ")
                ws.Cells(iRow, 1).Resize(1, 4).Value = _
                    Array(itm.SenderName, itm.Subject, itm.ReceivedTime, sBody)
                iRow = iRow + 1
            End If
        End If
    Next itm

    MsgBox "Outlook Mails Extracted to Excel"

End Sub

【讨论】:

  • 唯一的问题是,你知道为什么当我运行代码时它会挂这么多吗?等了一个小时后,我不得不强制退出。我得到了自动恢复excel的结果
  • 文件夹中有多少封邮件?
  • 我运行了过去 24 天的代码。大约 1200 封电子邮件
  • 那么我想它可能需要一些时间来运行呢?我无法在这里测试。也许在循环中添加一个Debug.Print,以便您可以监控进度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 2018-10-16
  • 2017-03-15
相关资源
最近更新 更多